{
  "openapi": "3.1.0",
  "info": {
    "title": "SKIF.PRO API",
    "version": "1.5.0",
    "description": "Официальная спецификация и документация внешнего API телематической платформы SKIF.PRO (v1).\n\nВсе запросы выполняются относительно базового пути `/api_v1`.\nДля авторизации используется метод `POST /api_v1/login` (в ответе устанавливается сессионная cookie `session`).",
    "contact": {
      "name": "Команда платформы SKIF.PRO",
      "url": "https://skif.pro"
    }
  },
  "servers": [
    {
      "url": "https://app.skif.pro",
      "description": "Рабочий контур (Production)"
    },
    {
      "url": "https://api.skif.pro",
      "description": "Стенд разработки (dev5)"
    },
    {
      "url": "https://dev.skif.pro",
      "description": "Стенд разработки (dev)"
    }
  ],
  "paths": {
    "/api_v1/registrate": {
      "post": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/registrate",
        "description": "**Используется для регистрации нового пользователя в системе.**\n\n---\n\nРегистрирует пользователя с указанным email (параметр user_provider_id) и создает новую компанию, в которой пользователь становится администратором (роль Admin).\n\nНа указанный email отправляется ссылка для подтвержения аккаунта.\n\nПользователь сразу логинится в системе (создается сессия) и может выполнять любые запросы, требующие авторизации.\n\n---\n\n**Параметры:**\n\n```\nuserProviderId - email пользователя (обязательный)\ntype - тип регистрации, всегда \"EMAIL\" (обязательный)\npassword - пароль (обязательный)\nname - имя нового пользователя (необязательный, по умолчанию копируется email)\nphone - телефон нового пользователя\ncompany_name - название компании (необязательный, по умолчанию будет имя из email до символа @\ntimezone - (обязательный) значение часового пояса из справочника dictionary (см. type = 'timezone')\nlanguage - (обязательный) значение из справочника dictionary (см type = 'lang')\ncaptcha - код с картинки получаемой методом GET /captcha\ninvite_id - ID приглашения, получается из link в письме на почту, параметр invite_id\n{\n  \"userProviderId\": \"user@example.com\",\n  \"type\": \"EMAIL\",\n  \"company_name\": \"BigBin\",\n  \"password\": \"your_secure_password\",\n  \"name\": \"Имя пользователя\",\n  \"timezone\": {\n    \"key\": \"UTC+3\"\n  },\n  \"language\": {\n    \"key\": \"ru\"\n  }\n}\n\n ```\n\n**Параметры ответа:**\n\nКод 200 и пустой body в случае успеха.\n\nЕсли уже есть аккаунт (см. /approve) с таким email, то возращается Код 422 и body c ошибкой session.errors.emailAlreadyRegistered\n\nВ случае частого вызова метода (чаще чем раз в 30 секунд), то возращается Код 400 и body validation.errors.often",
        "operationId": "registrate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "invite_id": {
                    "type": "string",
                    "example": "c5b2edce-5a1e-47c9-a433-422e83c95dc9"
                  },
                  "language": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "ru"
                      }
                    }
                  },
                  "name": {
                    "type": "string",
                    "example": "Миша"
                  },
                  "password": {
                    "type": "string",
                    "example": "12345N"
                  },
                  "timezone": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "UTC+3"
                      }
                    }
                  },
                  "type": {
                    "type": "string",
                    "example": "EMAIL"
                  },
                  "userProviderId": {
                    "type": "string",
                    "example": "user@example.com"
                  }
                }
              },
              "examples": {
                "/registrate": {
                  "value": {
                    "invite_id": "c5b2edce-5a1e-47c9-a433-422e83c95dc9",
                    "language": {
                      "key": "ru"
                    },
                    "name": "Миша",
                    "password": "12345N",
                    "timezone": {
                      "key": "UTC+3"
                    },
                    "type": "EMAIL",
                    "userProviderId": "user@example.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "x-rate-limit": "2 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/login": {
      "post": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/login",
        "description": "**Авторизация пользователя с помощью email**\n\n---\n\nПроверяет корректность связки email и пароля для авторизации пользователя. Если авторизация проходит успешно, то в cookies помещается id сессии пользователя, которая используется для авторизации дальнейших вызовов функции API под авторизованным пользователем. В случае если пользователь заходит по временному паролю (присланному при восстановлении пароля или вторичной регистрации по уже зарегистрированному телефону), то временный пароль становится постоянным.\n\n---\n\n**Параметры:**\n\n\"userProviderId\" - email (обязательный) или логин  \n\"provider_key\" - костанта \"TEXT\" (обязательный)  \n\"password\" - пароль (обязательный)\n\n\"is_admin_panel\" - true отправляется при входе в админ-панель\n\nВ поле password необходимо указать пароль, полученный при регистрации по смс (или email при тестовом режиме)\n\n```\n{\n  \"userProviderId\": \"user@example.com\",  (обязательный)\n  \"provider_key\": \"EMAIL\",  (обязательный)\n  \"password\": \"your_secure_password\"        (обязательный)\n}\n\n ```\n\n---\n\n**Параметры ответа:**\n\nВ случае успешной авторизации возвращается пустой body с кодом 200.\n\nВ случае не успешной авторизации возвращается status: 422 и json-body с ошибкой.",
        "operationId": "login",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "password": {
                    "type": "string",
                    "example": "12345N"
                  },
                  "provider_key": {
                    "type": "string",
                    "example": "TEXT"
                  },
                  "userProviderId": {
                    "type": "string",
                    "example": "user@example.com"
                  }
                }
              },
              "examples": {
                "/login": {
                  "value": {
                    "password": "12345N",
                    "provider_key": "TEXT",
                    "userProviderId": "user@example.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "x-rate-limit": "5 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/recovery": {
      "post": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/recovery",
        "description": "**Восстановление пароля**\n\n---\n\nМетод создает временный пароль для существующего пользователя. Новый пароль отправляется на указанный email. В тестовой среде отправляет письмо на отладочные почтовые ящики.\n\n---\n\n**Параметры:**\n\n```\nuser_provider_id - телефон пользователя (обязательный)\ntype - константа, всегда \"EMAIL\" (обязательный)\n{\n  \"user_provider_id\": \"user@example.com\",\n  \"type\": \"EMAIL\"\n}\n\n ```\n\n---\n\n**Параметры ответа:**\n\nКод 200. Даже если пользователь с указанным паролем не существует.\n\n```\n{\n  \"pssword\": \"\"\n}\n\n ```\n\nОшибка валидации - код 422, с перечнем ошибок в полях\n\n```\n{\n    \"errors\": [\n        {\n            \"code\": 4221,\n            \"field\": \"password\",\n            \"message\": \"Отсутствует параметр\"\n        }\n    ],\n    \"code\": 4220,  //общий код ошибки\n    \"message\": \"Отсутствует параметр\" // частный\n}\n\n ```",
        "operationId": "recovery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "example": "EMAIL"
                  },
                  "user_provider_id": {
                    "type": "string",
                    "example": "user@example.com"
                  }
                }
              },
              "examples": {
                "/recovery": {
                  "value": {
                    "type": "EMAIL",
                    "user_provider_id": "user@example.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "x-rate-limit": "2 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/recovery/qr/{user_id}": {
      "get": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/recovery/qr/:user_id",
        "description": "**Вход через qr**\n\n---\n\nМетод создает временный пароль для существующего пользователя. По ссылке auth.recovery_url можно получить сессию и сменить пароль. Так же, если для пользователя настроен vpn, его парамеры будут возвращены в теге vpn\n\nПараметры:\n\nuser_id - id пользователя (обязательный)\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Параметры ответа:**\n\nКод 200. Даже если пользователь с указанным паролем не существует. Ответ всегда такого вида\n\n```\n{\n    \"vpn\": {\n        \"privateKey\": \"EXAMPLE_WIREGUARD_PRIVATE_KEY_BASE64=\",\n        \"address\": \"10.8.0.4/23\",\n        \"dns\": \"8.8.8.8\",\n        \"publicKey\": \"EXAMPLE_WIREGUARD_PUBLIC_KEY_BASE64=\",\n        \"allowedIPs\": \"0.0.0.0/0\",\n        \"endpoint\": \"vpn.skif.pro:51820\",\n        \"persistentKeepalive\": \"20\"\n    },\n    \"auth\": {\n        \"recovery_url\": \"https://api.skif.pro/recovery/75c93998-f410-4e4a-a470-722940f10946\"\n    }\n}\n\n ```\n\nОшибка валидации - код 422, с перечнем ошибок в полях\n\n```\n{\n    \"errors\": [\n        {\n            \"code\": 4221,\n            \"field\": \"\",\n            \"message\": \"Отсутствует параметр\"\n        }\n    ],\n    \"code\": 4220,  //общий код ошибки\n    \"message\": \"Отсутствует параметр\" // частный\n}\n\n ```",
        "operationId": "recoveryQrUserId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя для генерации QR восстановления",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "user_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/logout": {
      "put": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/logout",
        "description": "**Выход из учетной записи**\n\n---\n\nУдаляет все сессии пользователя на сервере.\n\n---\n\n**Параметры:** пусто\n\n---\n\n**Ответ**: 200",
        "operationId": "logout",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/reset_password/{user_id}": {
      "put": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/reset_password/:user_id",
        "description": "**Сбросить пароль пользователя администратором (только администратор)**\n\n---\n\nУстановить новый временный пароль для пользователя. После чего пользователь должен изменить пароль после входа.\n\n---\n\n**Параметры:**\n\nuser_id - ID пользователя  \nnewPassword - новый пароль\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nОтвет: Пустой 200. Новый пароль установлен или ошибка\n\n---\n\nПример запроса:\n\n``` json\n{\n    \"newPassword\": \"your_secure_password\"\n}\n\n ```",
        "operationId": "resetPasswordUserId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "newPassword": {
                    "type": "string",
                    "example": "Aa@1234567891011121314"
                  }
                }
              },
              "examples": {
                "/reset_password/:user_id": {
                  "value": {
                    "newPassword": "Aa@1234567891011121314"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя, которому сбрасывается пароль",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "user_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/change_my_password": {
      "put": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/change_my_password",
        "description": "**Изменить свой пароль пользователем**\n\n---\n\nУстановить новый пароль пользователя для себя.\n\n---\n\n**Параметры:**\n\npassword - текущий пароль  \nnewPassword - новый пароль\n\n---\n\nОтвет: Пустой 200 новый пароль установлен или ошибка\n\n---\n\n**Пример запроса:**\n\n``` json\n{\n    \"password\": \"your_secure_password\",\n    \"newPassword\": \"your_secure_password\"\n}\n\n ```",
        "operationId": "changeMyPassword",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/approve/{id}": {
      "get": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/approve/:id",
        "description": "**Подтверждение email. Используется для подтверждения email по ссылке полученной на почту.**\n\n---\n\nДелает email подтвержденным, после чего зарегистироваться с таким email уже не возможно.  \nПользователь сразу авторизуется в системе без ввода email и пароля.\n\nСоздается временный id помещенный в redis со временем жизни 30 мин\n\n---\n\n**Параметры:**\n\nid - временный id связанный с email\n\n---\n\n**Ответ:**\n\nВозвращает код 200 с пустым body\n\nВозвращает код 422 в случае если id не валидно\n\n``` json\n{\n    \"code\": 4022,\n    \"field\": \"id\",\n    \"message\": \"Ссылка устарела, повторите операцию\"\n}\n\n ```",
        "operationId": "approveId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Идентификатор подтверждения учетной записи",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/company/invite/{id}": {
      "get": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/company/invite/:id",
        "description": "**Авторизация по приглашению. Используется для получения доступа к компании по ссылке, полученной на почте.**\n\n---\n\nСоздает пользователя, если он не был ранее зарегистрирован и дает доступ к компании из которой Администратор вызвал метод POST /invite  \nПользователь сразу авторизуется в системе без ввода email и пароля под приглашенной Компанией.\n\n---\n\n**Пример запроса:**\n\nСоздается временный id помещенный в redis со временем жизни 30 мин.\n\nid связан с email и компанией, в которую приглашают пользователя (оба значения можно помещать в качестве значения в redis)\n\n**Параметры:**\n\nid - временный id связанный с email и Компанией в которую приглашают пользователя\n\n---\n\n**Ответ:**\n\nВозвращает код 200 с пустым body\n\nВозвращает код 422 в случае если id не валидно\n\n``` json\n{\n    \"code\": 4022,\n    \"field\": \"id\",\n    \"message\": \"Ссылка устарела, повторите операцию\"\n}\n\n ```",
        "operationId": "companyInviteId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Токен / ID ссылки приглашения в компанию",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/recovery/{id}": {
      "get": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/recovery/:id",
        "description": "**Авторизация по ссылке восстановления, полученной по почте. Используется для авторизации пользователя в системе для последующей смены пароля.**\n\n---\n\nПользователь сразу авторизуется в системе без ввода email и пароля. При этом если у пользователя доступ к нескольким компаниям, то предлагается выбор Компании, в которую пользователь хочет войти через метод GET switchcompany/:id\n\n---\n\n**Пример запроса:**\n\nСоздается временный id, помещенный в redis со временем жизни 30 мин. id связан с email\n\n**Параметры:**\n\nid - временный id связанный с email\n\n---\n\n**Ответ:**\n\nВозвращает код 200 с пустым body\n\nВозвращает код 422 в случае, если id не валидно\n\n``` json\n{\n    \"code\": 4022,\n    \"field\": \"id\",\n    \"message\": \"Ссылка устарела, повторите операцию\"\n}\n\n ```",
        "operationId": "recoveryId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Идентификатор ссылки восстановления пароля из email",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/captcha": {
      "get": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/captcha",
        "description": "Для регистрации необходимо передать код с картинки, получаемый из этого метода в поле captcha",
        "operationId": "captcha",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/ask_approve_code": {
      "post": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/ask_approve_code",
        "description": "**Запрос получения кода**\n\n---\n\n**Параметры:**  \nprovider_key: text, для подтверждения номером телефона (пока только так) provider_key = PHONE  \nuserProviderId - text, номер телефона если provider_key = PHONE\n\n**Пример запроса:**\n\n``` json\n{\n    \"userProviderId\": \"+7XXXXXXXXXX\",\n    \"provider_key\": \"PHONE\"\n}\n\n ```\n\nВ ответ приходит 200, если запрос правильный, иначе ошибка",
        "operationId": "askApproveCode",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "provider_key": {
                    "type": "string",
                    "example": "PHONE"
                  },
                  "userProviderId": {
                    "type": "string",
                    "example": "+79990000001"
                  }
                }
              },
              "examples": {
                "/ask_approve_code": {
                  "value": {
                    "provider_key": "PHONE",
                    "userProviderId": "+79990000001"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "5 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/ask_approve_code_voice": {
      "post": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/ask_approve_code_voice",
        "description": "**Запрос получения кода через звонок**\n\n---\n\n**Параметры:**  \nprovider_key: text, для подтверждения номером телефона, provider_key = PHONE  \nuserProviderId - text, номер телефона, если provider_key = PHONE\n\n**Пример запроса:**\n\n```\n{\n    \"userProviderId\": \"+7XXXXXXXXXX\",\n    \"provider_key\": \"PHONE\"\n}\n\n ```\n\nВ ответ приходит 200, если запрос правильный, иначе ошибка",
        "operationId": "askApproveCodeVoice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "provider_key": {
                    "type": "string",
                    "example": "PHONE"
                  },
                  "userProviderId": {
                    "type": "string",
                    "example": "+79990000001"
                  }
                }
              },
              "examples": {
                "/ask_approve_code_voice": {
                  "value": {
                    "provider_key": "PHONE",
                    "userProviderId": "+79990000001"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "5 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/approve_code": {
      "post": {
        "tags": [
          "Авторизация"
        ],
        "summary": "/approve_code",
        "description": "**Подтверждение аккаунта с помощью кода**\n\n---\n\n**Параметры:**  \nprovider_key: text, ддля подтверждения номером телефона(пока только так) provider_key = PHONE  \nuserProviderId - text, номер телефона если provider_key = PHONE  \ncode: text, полученный код\n\n\n**Пример запроса:**\n\n```\n{\n    \"userProviderId\": \"7XXXXXXXXXX\",\n    \"provider_key\": \"PHONE\",\n    \"code\": \"27280\"\n}\n\n ```",
        "operationId": "approveCode",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "example": "52798"
                  },
                  "provider_key": {
                    "type": "string",
                    "example": "PHONE"
                  },
                  "userProviderId": {
                    "type": "string",
                    "example": "+79990000001"
                  }
                }
              },
              "examples": {
                "/approve_code": {
                  "value": {
                    "code": "52798",
                    "provider_key": "PHONE",
                    "userProviderId": "+79990000001"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public",
        "parameters": []
      }
    },
    "/api_v1/me": {
      "get": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/me",
        "description": "**Получить информацию о текущем пользователе**\n\n---\n\nМетод выдает информацию по текущему пользователю\n\n---\n\n**Роль:** Наблюдатель и выше.\n\n---\n\n**Ответ:**\n\n```\n{\n  \"id\": \"75bd17cc-642f-4c7c-982e-e0e991907733\",    //  id пользователя\n  \"created\": \"2017-03-10 16:56:41\",          //  дата создания\n  \"role\": {\"key\": \"Editor\", \"value\": \"Редактор\"}, //роль пользователя. В системе есть роли NoAccess - пользователь без доступа, Editor - обычный пользователь,  Reader - читатель, Admin - администратор (может изменять роли других пользователей, блокировать)\n  },\n \"actions\": [ // список действий пользователя, весь список: GET /actions\n      {\n          \"id\": \"5858822c-1f21-431b-9cde-a672d2803b2b\",\n          \"key\": \"generate_report\",\n      },\n      {\n        \"id\": \"6ff2a8bd-48d6-4347-b42e-c01d73434fb5\",\n        \"key\": \"units/update\"\n      }\n  ],\n  \"name\": \"Иван Иванов\",                  //  имя\n  \"email\": \"user@example.com\",\n  \"is_approved\": true, //подтвержден ли аккаунт\n  \"is_driver\": true, //является ли пользователь водителем\n  \"need_change_password\": true, // Если у пользователя установлен временный пароль, то пользователь должен изменить свой пароль\n  \"telegram_chat_id\": 12345678910, //id-рассылки для Telegram\n  \"photos\": [{\n        \"id\": \"b549d113-88e7-4002-b792-8f76d6694aa3\",\n        \"url\": \"/photos/b549d113-88e7-4002-b792-8f76d6694aa3_original.png\", //путь к оригинальной картинке\n        \"width\": 850,\n        \"height\": 670,\n        \"param_type\": \"users\" //тип картинки, для пользователей - users\n    }, {\n        \"id\": \"a8a0d710-01f4-4952-8a0f-35e345f2ad98\",\n        \"url\": \"/photos/b549d113-88e7-4002-b792-8f76d6694aa3_110.png\", //путь к картинке с максимальной стороной в 110px\n        \"width\": 110,\n        \"height\": 86,\n        \"param_type\": \"users\" //тип картинки, для пользователей - users\n    }],\n  \"code\": \"092384\",                //  id пользователя (rfid)\n  \"language\" : {\"key\":\"en\", \"value\":\"English\", \"type\":\"languages\"},                  //язык пользователя\n  \"phone\" : \"+79990000001\",\n  \"details\": \"Просто текстовое поле\",\n  \"companies\": [{\"id\":\"75bd17cc-642f-4c7c-982e-e0e991907733\", \"name\":\"Моя первая Компания\", \"timezone\": \"UTC+3\"}] //доступные пользователю компании\n  \"active_company\": {\"id\":\"75bd17cc-642f-4c7c-982e-e0e991907733\", \"name\":\"Моя первая Компания\", \"timezone\": \"UTC+3\"}\n  \"settings_web\": {}, // настройки в виде json, специфические для web-клиента\n  \"settings_ios\": {},// настройки в виде json, специфические для iOS-клиента\n  \"settings_android\": {},// настройки в виде json, специфические для android-клиента\n  \"actions_templates\": {},// настройки в виде json\n   \"actions\": [// список действий пользователя,\n      {\n          \"id\": \"5858822c-1f21-431b-9cde-a672d2803b2b\",\n          \"key\": \"generate_report\",\n      },\n    {\n        \"id\": \"6ff2a8bd-48d6-4347-b42e-c01d73434fb5\",\n        \"key\": \"units/update\"\n    }\n  ],\n  \"units_access\": [//Доступ к объектам\n      {\n            \"unit\": {\n                \"id\": \"0c4095e1-8cf4-4be2-b8b8-5aacf528a6dd\"\n            },\n            \"actions\": [] // cписок действий, можно выбирать те actions для которых  is_unit_action = true\n        },\n        {\n            \"unit\": {\n                \"id\": \"d0dd6178-fd10-4f49-8627-a386ac35b8c3\"\n            },\n            \"actions\": [{\n                    \"id\": \"051d5caf-b40a-4474-9c25-fb0d83ea4891\",\n                    \"key\": \"delete_units\"\n                },\n                {\n                    \"id\": \"bc7f985c-9641-4d0a-9f6f-8d5214d98105\",\n                    \"key\": \"update_units\"\n                }\n            ]\n        }\n    ],\n    \"units_groups_access\": [{ //Доступ к группам\n            \"units_group\": {\n                \"id\": \"d7bad56b-bb05-4c9c-830b-ed192a3fa4de\"\n            },\n            \"actions\": []//список действий, можно выбирать те actions для которых  is_unit_action = true\nуказанные actions применяются для всех объектов группы\n        },\n        {\n            \"units_group\": {\n                \"id\": \"1769a313-0c20-4ebf-b7f6-7fce00f4f301\"\n            },\n            \"actions\": [{\n                    \"id\": \"051d5caf-b40a-4474-9c25-fb0d83ea4891\",\n                    \"key\": \"delete_units\"\n                },\n                {\n                    \"id\": \"bc7f985c-9641-4d0a-9f6f-8d5214d98105\",\n                    \"key\": \"update_units\"\n                }\n            ]\n        }\n    ],\n}\n\n ```",
        "operationId": "me",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": []
      },
      "put": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/me",
        "description": "**Обновить данные текущего пользователя**\n\n---\n\nОбновляет те поля, которые содержатся в запросе. Поля отсутствующие в запросе, не обновляются.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n  \"name\": \"Иван Иванов\",          //  имя\n}\n\n ```\n\n**Параметры:**\n\n```\n{\n  \"role\": {\"key\": \"Editor\", \"value\": \"Редактор\"}, // не доступно для изменения самому пользователю\n  \"password\": \"your_secure_password\" //новый пароль\n  \"name\": \"Иван Иванов\",     //имя\n  \"is_driver\": true // делает пользователя водителем\n  \"email\": \"user@example.com\", //email\n  \"code\": \"092384\",                //  id пользователя (rfid), доступно для пользователя с ролью Editor\n  \"language\" : {\"key\":\"en\"}                  //язык пользователя\n  \"phone\" : \"+79990000001\" //телефон пользователя\n  \"details\": \"Просто текстовое поле\"\n  \"telegram_chat_id\": 12345678910,\n  \"settings_web\": {}, // настройки в виде json специфические для web-клиента\n  \"settings_ios\": {},// настройки в виде json специфические для iOS-клиента\n  \"settings_android\": {},// настройки в виде json специфические для android-клиента\n}\n\n ```\n\n---\n\n**Ответ:**\n\nВозвращает обновленную запись пользователя см. GET /me",
        "operationId": "me1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "age": {
                    "type": "string",
                    "example": "38"
                  },
                  "name": {
                    "type": "string",
                    "example": "Миша"
                  },
                  "town": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "Taldykorgan"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/me": {
                  "value": {
                    "age": "38",
                    "name": "Миша",
                    "town": {
                      "key": "Taldykorgan"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": []
      }
    },
    "/api_v1/users": {
      "get": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users?ids=:ids",
        "description": "**Получить информацию о текущем пользователе по его id**\n\n---\n\nВозвращает данные по пользователям переданных id. Возвращаются только те пользователи, у которых есть доступ к текущей компании пользователя, который делает запрос.\n\n---\n\n**Параметры:**\n\nids - может содержать как один id пользователя, так и несколько, разделенных через запятую.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Ответ:**\n\nМассив объектов пользователей, каждый объект которого аналогичен возвращаемому через метод GET /me",
        "operationId": "usersIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader"
      },
      "delete": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users?ids=:ids",
        "description": "**Планирование удаления пользователей по их ID**\n\n---\n\nЛогика использования, как в DELETE /company/users?ids=:ids  \nПользователь с ролью SUPERVISOR может удалять других пользователей.\n\n---\n\n**Роль:** Администратор и выше.",
        "operationId": "usersIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Вася"
                  },
                  "transport": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "Bicycle"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/users?ids=:ids": {
                  "value": {
                    "name": "Вася",
                    "transport": {
                      "key": "Bicycle"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin"
      },
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "Создание пользователя или водителя",
        "description": "**Создание пользователя или водителя**\n\n---\n\nСоздает пользователя в активной компании без приглашения.\n\nЭкспресс-создание водителя. Если переданы `is_driver: true`, пустой `email`, роль не передана или равна `NO_ACCESS`, а `use_name_as_login` не равен `true`, система сама генерирует технический email вида `driver_<hex10>@nomail.skif.pro` (`<hex10>` — 10 случайных шестнадцатеричных символов), случайный пароль и назначает роль «Без доступа». Письмо о создании аккаунта не отправляется.\n\nПользователь по логину и паролю. Если передан `use_name_as_login: true`, в `name` передается логин. Email необязателен: если он не указан, генерируется технический адрес `@nomail.skif.pro`. Логин уникален во всей системе.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Параметры:**\n- name: string - имя (ФИО), при `use_name_as_login: true` — логин. Обязательно.\n- email: string - email для входа. Обязательно, кроме случаев `use_name_as_login: true` и экспресс-создания водителя.\n- password: string - пароль. Необязательно. Проверяется по парольной политике компании. При экспресс-создании водителя игнорируется.\n- use_name_as_login: boolean - вход по `name` вместо email. Необязательно.\n- is_driver: boolean - признак водителя. Необязательно. По умолчанию `false`.\n- role: object - роль пользователя. Необязательно. По умолчанию роль «Без доступа» (`NO_ACCESS`).\n  - id: string (UUID) - идентификатор роли, список ролей — `GET /roles`. Необязательно, если указан key.\n  - key: string - ключ роли. Необязательно, если указан id. Возможные значения: `NO_ACCESS`, `OBSERVER`, `READER`, `OPERATOR`, `EDITOR`, `ADMIN`.\n- code: number - код водителя (ключ, RFID) для автоназначения. Необязательно. Только цифры. У водителя код должен быть уникален в компании.\n- phone: string - телефон. Необязательно. Уникален в системе.\n- lang: object - язык пользователя. Необязательно. По умолчанию — язык платформы по умолчанию (на SKIF.PRO — `ru`).\n  - key: string - ключ языка. Возможные значения: `ru`, `en`, `kz`, `fr`, `bg`.\n- details: string - примечание. Необязательно.\n- telegram_chat_id: number - id чата Telegram для рассылок, получается из бота. Необязательно.\n- properties: object - дополнительные свойства пользователя. Необязательно.\n\n---\n\n**Пример запроса:**\nЭкспресс-создание водителя\n\n```\n{\n  \"name\": \"Петров Петр Петрович\",\n  \"is_driver\": true,\n  \"phone\": \"+79990000001\",\n  \"code\": 777\n}\n```\n\nПользователь по логину и паролю\n\n```\n{\n  \"name\": \"dispatcher_1\",\n  \"password\": \"Passw0rd!\",\n  \"use_name_as_login\": true,\n  \"role\": {\"key\": \"OBSERVER\"}\n}\n```\n\n---\n\n**Ответ:**\nСозданный пользователь, объект аналогичен `GET /me`.\n\n```\n{\n  \"id\": \"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\",\n  \"name\": \"Петров Петр Петрович\",\n  \"email\": \"driver_a3f09c21b7@nomail.skif.pro\",\n  \"phone\": \"+79990000001\",\n  \"code\": 777,\n  \"details\": \"\",\n  \"is_driver\": true,\n  \"use_name_as_login\": null,\n  \"telegram_chat_id\": null,\n  \"lang\": {\"key\": \"ru\"},\n  \"role\": {\"id\": \"b12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"key\": \"NO_ACCESS\", \"value\": \"Без доступа\"}\n}\n```\n\nКод 422:\n- пустое `name`;\n- неверный email или email, телефон, логин уже заняты;\n- пароль не соответствует политике компании;\n- код водителя уже есть в компании (`validation.errors.driverCodeAlreadyExists`).\n",
        "operationId": "createUserDirect",
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Петров Петр Петрович",
                    "description": "Имя (ФИО); при use_name_as_login — логин"
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "example": "demo_user@skif.pro",
                    "description": "Обязателен, кроме use_name_as_login и экспресс-создания водителя"
                  },
                  "password": {
                    "type": "string",
                    "example": "Passw0rd!",
                    "description": "По парольной политике компании; для водителя без email игнорируется"
                  },
                  "use_name_as_login": {
                    "type": "boolean",
                    "example": false
                  },
                  "is_driver": {
                    "type": "boolean",
                    "example": true
                  },
                  "role": {
                    "type": "object",
                    "description": "Роль: id из GET /roles или key базовой роли",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "example": "6592d562-e965-43bd-9d9e-8319cabd6291"
                      },
                      "key": {
                        "type": "string",
                        "enum": [
                          "NO_ACCESS",
                          "OBSERVER",
                          "READER",
                          "OPERATOR",
                          "EDITOR",
                          "ADMIN"
                        ],
                        "example": "OBSERVER"
                      }
                    }
                  },
                  "code": {
                    "type": "integer",
                    "example": 777,
                    "description": "Код водителя (ключ, RFID), уникален в компании"
                  },
                  "phone": {
                    "type": "string",
                    "example": "+79990000001"
                  },
                  "lang": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "enum": [
                          "ru",
                          "en",
                          "kz",
                          "fr",
                          "bg"
                        ],
                        "example": "ru"
                      }
                    }
                  },
                  "details": {
                    "type": "string",
                    "example": ""
                  },
                  "telegram_chat_id": {
                    "type": "integer",
                    "example": 123456789
                  },
                  "properties": {
                    "type": "object"
                  }
                }
              },
              "examples": {
                "Экспресс-создание водителя": {
                  "value": {
                    "name": "Петров Петр Петрович",
                    "is_driver": true,
                    "phone": "+79990000001",
                    "code": 777
                  }
                },
                "Пользователь по логину и паролю": {
                  "value": {
                    "name": "dispatcher_1",
                    "password": "Passw0rd!",
                    "use_name_as_login": true,
                    "role": {
                      "key": "OBSERVER"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Созданный пользователь, объект аналогичен GET /me",
            "content": {
              "application/json": {
                "example": {
                  "id": "a4f6c292-5a8a-4edd-93b0-c5f3ea20c5db",
                  "name": "Петров Петр Петрович",
                  "email": "driver_a3f09c21b7@nomail.skif.pro",
                  "phone": "+79990000001",
                  "code": 777,
                  "is_driver": true,
                  "lang": {
                    "key": "ru"
                  },
                  "role": {
                    "id": "6592d562-e965-43bd-9d9e-8319cabd6291",
                    "key": "NO_ACCESS",
                    "value": "Без доступа"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/429RateLimit"
          }
        },
        "parameters": []
      }
    },
    "/api_v1/users/{user_id}": {
      "put": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id",
        "description": "**Обновить информацию о текущем пользователе по его id.**\n\n---\n\nОбновление пользователя по его id. Пользователь с ролями User, Provider, Executor может менять только себя.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПараметры и ответ аналогичны методу POST /users",
        "operationId": "usersId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Вася"
                  },
                  "transport": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "Bicycle"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/users/:id": {
                  "value": {
                    "name": "Вася",
                    "transport": {
                      "key": "Bicycle"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "description": "Параметр пути user_id",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id/check_use_name_as_login",
        "description": "**Обновить информацию о текущем пользователе по его id.**\n\n---\n\nРоут для проверки уникальности строки Имя пользователя для использования в качестве логина\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПример запроса:\n\n``` json\n{\"name\": \"Иванов Иван Иванович\"}\n\n ```",
        "operationId": "usersIdCheckUseNameAsLogin",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Вася"
                  },
                  "transport": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "Bicycle"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/users/:id/check_use_name_as_login": {
                  "value": {
                    "name": "Вася",
                    "transport": {
                      "key": "Bicycle"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "description": "Параметр пути user_id",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id",
        "description": "**Удаление пользователя по его id**\n\n---\n\n**Роль:** Администратор и выше.",
        "operationId": "usersId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Вася"
                  },
                  "transport": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "Bicycle"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/users/:id": {
                  "value": {
                    "name": "Вася",
                    "transport": {
                      "key": "Bicycle"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "description": "Параметр пути user_id",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "user_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/users/query": {
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "Получение списка пользователей по фильтру",
        "description": "**Получение списка пользователей по фильтру**\n\n---\n\nВозвращает пользователей активной компании с фильтрацией, сортировкой и постраничным выводом. Пользователи с ролью выше, чем у запрашивающего, не возвращаются.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Параметры:**\n- from: integer - с какой строки возвращать список, 0 — первая. Необязательно.\n- limit: integer - сколько строк возвращать, 0 — все. Необязательно.\n- fields: array of string - поля, которые нужно включить в результат, например `[\"id\", \"name\"]`. Необязательно.\n- sortField: string - поле сортировки. Необязательно. Возможные значения: `name`, `code`, `details`, `role.key`, `email`, `phone`.\n- sortDesc: boolean - сортировка по убыванию. Необязательно.\n- value: string - подстрока для поиска по полям `name`, `code`, `details`, `role.key`, `email`, `phone`. Необязательно.\n- is_driver: boolean - `true` — только водители, `false` — только не водители. Необязательно. Если не передан, возвращаются все.\n- role_keys: array of string - вернуть только пользователей с этими ролями. Необязательно. Возможные значения: ключи ролей, например `OBSERVER`, `ADMIN`, `NO_ACCESS`.\n- exclude_role_keys: array of string - исключить пользователей с этими ролями. Необязательно. Возможные значения аналогичны `role_keys`.\n- with_last_login: boolean - добавить каждому пользователю в `list` время последнего входа в активную компанию (`last_login`). Необязательно. По умолчанию `false`.\n- with_current_shift: boolean - добавить каждому водителю в `list` текущую смену (`current_shift`). Необязательно. По умолчанию `false`. Работает только вместе с `is_driver: true`, без него игнорируется.\n\n`last_login` берется из журнала сессий компании (тот же, что в `POST /company/sessions/query`) и возвращается в формате даты и времени и часовом поясе компании, например `02-09-2026 11:00:00`. Это время начала последнего сеанса: повторные входы с того же IP в пределах сеанса не учитываются, запись в журнале появляется с задержкой до минуты. Если входов нет, `last_login` равен `null`.\n\nПередавайте `with_last_login` и `with_current_shift` только тогда, когда эти колонки показываются: каждый флаг — дополнительный запрос (в журнал сессий и в сервис объектов). Например, `with_current_shift: true` — при открытии списка «Водители», `with_last_login: true` — при открытии списка «Пользователи».\n\n`current_shift` возвращается только в списке водителей: при `is_driver: true` и `with_current_shift: true`. Это смена, которая идет сейчас: объект (`unit`: `id`, `name`), начало и конец смены (`date_to` равен `null`, если смена не закрыта). Если сейчас идет несколько смен, возвращается начавшаяся последней. Если текущей смены нет или сервис объектов не ответил за 3 секунды, `current_shift` равен `null`.\n\n`is_driver: false` исключает и сотрудников, у которых одновременно рабочая роль и признак водителя. Чтобы показать всех пользователей с доступом в систему, включая таких сотрудников, фильтруйте по ролям через `exclude_role_keys`.\n\n---\n\n**Пример запроса:**\nРаздел «Водители»: все водители независимо от роли, с текущей сменой\n\n```\n{\n  \"is_driver\": true,\n  \"with_current_shift\": true,\n  \"sortField\": \"name\",\n  \"sortDesc\": false,\n  \"from\": 0,\n  \"limit\": 50\n}\n```\n\nРаздел «Пользователи»: без роли «Без доступа» и системных ролей, с последним входом\n\n```\n{\n  \"exclude_role_keys\": [\"NO_ACCESS\", \"SUPERVISOR\", \"TARIFF_EDITOR\", \"CONTROLLER\"],\n  \"with_last_login\": true,\n  \"from\": 0,\n  \"limit\": 50\n}\n```\n\n---\n\n**Ответ:**\n`max` — сколько всего записей подходит под фильтр, `list` — текущая страница. Поле `last_login` есть только при `with_last_login: true`, `current_shift` — только при `is_driver: true` и `with_current_shift: true`. Объекты списка аналогичны `GET /me`. Если ничего не нашлось, `list` пустой.\n\n```\n{\n  \"max\": 1,\n  \"list\": [\n    {\n      \"id\": \"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\",\n      \"name\": \"Петров Петр Петрович\",\n      \"email\": \"driver_a3f09c21b7@nomail.skif.pro\",\n      \"phone\": \"+79990000001\",\n      \"code\": 777,\n      \"details\": \"\",\n      \"is_driver\": true,\n      \"role\": {\"id\": \"b12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"key\": \"NO_ACCESS\", \"value\": \"Без доступа\"},\n      \"groups_ids\": [],\n      \"groups_count\": 0,\n      \"company_user\": true,\n      \"last_login\": \"02-09-2026 11:00:00\",\n      \"current_shift\": {\n        \"id\": \"d12345b2-6789-1ab2-3cd4-1ab234cd5e67\",\n        \"unit\": {\"id\": \"e12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"name\": \"КамАЗ 5490 (А123АА777)\"},\n        \"date_from\": \"28-09-2026 08:00:00\",\n        \"date_to\": null\n      }\n    }\n  ]\n}\n```\n",
        "operationId": "usersQuery",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "integer",
                    "example": 0
                  },
                  "limit": {
                    "type": "integer",
                    "example": 50
                  },
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "sortField": {
                    "type": "string",
                    "enum": [
                      "name",
                      "code",
                      "details",
                      "role.key",
                      "email",
                      "phone"
                    ]
                  },
                  "sortDesc": {
                    "type": "boolean"
                  },
                  "value": {
                    "type": "string"
                  },
                  "is_driver": {
                    "type": "boolean",
                    "description": "true — только водители, false — только не водители"
                  },
                  "role_keys": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Только эти роли"
                  },
                  "exclude_role_keys": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Все, кроме этих ролей"
                  },
                  "with_last_login": {
                    "type": "boolean",
                    "description": "Добавить last_login — последний вход в компанию"
                  },
                  "with_current_shift": {
                    "type": "boolean",
                    "description": "Добавить current_shift водителям; только вместе с is_driver: true"
                  }
                }
              },
              "examples": {
                "Водители": {
                  "value": {
                    "is_driver": true,
                    "with_current_shift": true,
                    "sortField": "name",
                    "from": 0,
                    "limit": 50
                  }
                },
                "Пользователи": {
                  "value": {
                    "exclude_role_keys": [
                      "NO_ACCESS",
                      "SUPERVISOR",
                      "TARIFF_EDITOR",
                      "CONTROLLER"
                    ],
                    "with_last_login": true,
                    "from": 0,
                    "limit": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "max — сколько записей подходит под фильтр, list — текущая страница",
            "content": {
              "application/json": {
                "example": {
                  "max": 1,
                  "list": [
                    {
                      "id": "a4f6c292-5a8a-4edd-93b0-c5f3ea20c5db",
                      "name": "Петров Петр Петрович",
                      "email": "driver_a3f09c21b7@nomail.skif.pro",
                      "phone": "+79990000001",
                      "code": 777,
                      "is_driver": true,
                      "role": {
                        "id": "6592d562-e965-43bd-9d9e-8319cabd6291",
                        "key": "NO_ACCESS",
                        "value": "Без доступа"
                      },
                      "groups_ids": [],
                      "groups_count": 0,
                      "company_user": true,
                      "last_login": "02-09-2026 11:00:00",
                      "current_shift": {
                        "id": "d12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                        "unit": {
                          "id": "e12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                          "name": "КамАЗ 5490 (А123АА777)"
                        },
                        "date_from": "28-09-2026 08:00:00",
                        "date_to": null
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/429RateLimit"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": []
      }
    },
    "/api_v1/users/photos": {
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/photos",
        "description": "**Добавление аватарки пользователю**\n\n---\n\nСохраняет фотографии на диске.\n\nПервый - оригинальный с url \"/imgs/\" + photo.id + \"_original.png\"\n\nВторой - миниатюра - с наибольшей стороной не больее 110 px, url - \"/imgs/\" + photo.id + \"_110.png\"\n\nОба файла можно использовать для сохранения в поле photos в сущности users\n\nПараметр - id пользователя, которому устанавливаем аватарку.\n\nОграничение - размер любой стороны передаваемой картинки не может быть больше 3000px\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Ответ:**\n\nВозможные ошибки:\n\n422, No File\n\n422, No Image\n\n422, Image size exceeded 3000x3000\n\nВозвращается модель вложения\n\n```\n[\n    {\n        \"id\": \"af571635-340e-4c4e-a4c0-4eab34a97e8c\",\n        \"url\": \"/imgs/af571635-340e-4c4e-a4c0-4eab34a97e8c_original.png\",\n        \"width\": 858,\n        \"height\": 536,\n        \"param_type\": \"users\"\n    },\n    {\n        \"id\": \"561518f7-6f1a-4f3c-8b9f-234a91d8ef16\",\n        \"url\": \"/imgs/af571635-340e-4c4e-a4c0-4eab34a97e8c_70.png\",\n        \"width\": 110,\n        \"height\": 43,\n        \"param_type\": \"users\"\n    }\n]\n\n ```",
        "operationId": "usersPhotos",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  },
                  "id": {
                    "type": "string",
                    "example": "5798e71d-52b5-4a7e-8089-00647872a3e4"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/ask_approve/{userId}": {
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/ask_approve/:userId",
        "description": "**Запросить подтверждение пользователя.**\n\n---\n\n**Параметры:**  \nuserId - ID пользователя\n\nТела запроса JSON:\n\nДля подтверждение email: { \"type\": \"EMAIL\" }\n\nДля подтверждение номер телефона: { \"type\": \"PHONE\" }\n\nМожно отправить запрос, если пользователь не подтвержден. Это определяется полем **is_approved** пользователя для email и **is_approved_phone** для номера телефона.\n\nВ случае успеха, в результате отправляется ответ 200 и отправляется письмо на почту или на телефон, указанную в настройке пользователя.\n\nИначе возвращается ошибка с кодом 422.",
        "operationId": "askApproveUserid",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "example": "PHONE"
                  }
                }
              },
              "examples": {
                "/ask_approve/:userId": {
                  "value": {
                    "type": "PHONE"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "description": "UUID пользователя для повторного запроса подтверждения",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "userId",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/users/{id}/companies": {
      "delete": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id/companies",
        "description": "**Удаление пользователя из выбранных компаний.**\n\n---\n\n**Параметры:**\n\nid - ID пользователя\n\nВ теле запроса указать список компаний (достаточно указать ID компании)",
        "operationId": "usersIdCompanies",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "2a4b08cd-6c92-4f74-93a9-2cd319caa601"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "2a4b08cd-6c92-4f74-93a9-2cd319caa601"
                      },
                      {
                        "id": "2f2c629a-9087-4925-8240-d6d6b90aafda"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/users/:id/companies": {
                  "value": {
                    "companies": [
                      {
                        "id": "2a4b08cd-6c92-4f74-93a9-2cd319caa601"
                      },
                      {
                        "id": "2f2c629a-9087-4925-8240-d6d6b90aafda"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/users/{id}/change_role": {
      "put": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id/change_role",
        "description": "**Изменение роли пользователя в компаниях.**\n\n---\n\n**Параметры:**\n\nid - ID пользователя\n\nВ теле запроса указать:\n\n- Список компаний (достаточно указать ID компании).\n\n- Новую роль в поле role.\n\n\n---\n\n**Роль:** Администратор и выше.",
        "operationId": "usersIdChangeRole",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "fc83e935-9c95-4b6f-aee4-be749479a2bc"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "fc83e935-9c95-4b6f-aee4-be749479a2bc"
                      }
                    ]
                  },
                  "role": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "EDITOR"
                      },
                      "name": {
                        "type": "string",
                        "example": "Редактор"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/users/:id/change_role": {
                  "value": {
                    "companies": [
                      {
                        "id": "fc83e935-9c95-4b6f-aee4-be749479a2bc"
                      }
                    ],
                    "role": {
                      "key": "EDITOR",
                      "name": "Редактор"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/users/{id}/change_role_all": {
      "put": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id/change_role_all",
        "description": "**Изменение роли пользователя во всех его компаниях, доступных авторизованному пользователю.**\n\n---\n\n**Параметры:**\n\nid - ID пользователя\n\nВ теле запроса указать новую роль в поле role\n\n---\n\n**Пример запроса:**\n\nPUT /api_v1/users/a8fa266e-3c70-44c8-933e-adb3fe17063d/change_role_all\n\n``` json\n{\n    \"role\": {\n        \"key\": \"EDITOR\",\n        \"name\": \"Редактор\"\n    }\n}\n\n ```",
        "operationId": "usersIdChangeRoleAll",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "role": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "ADMIN"
                      },
                      "name": {
                        "type": "string",
                        "example": "Редактор"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/users/:id/change_role_all": {
                  "value": {
                    "role": {
                      "key": "ADMIN",
                      "name": "Редактор"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/users/{id}/addable_companies": {
      "get": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id/addable_companies?search=search",
        "description": "**Получение списка компаний, доступных для добавления пользователя**\n\n---\n\n**Параметры:**\n\nid - ID пользователя\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nGET /api_v1/users/679bb60d-3563-4bdd-b7c5-bb72bcef69eb/addable_companies?search=Оду\n\n**Пример ответа:**\n\n``` json\n[\n    {\n        \"id\": \"06fe9426-9e0d-455b-9718-8c4f3400370b\",\n        \"name\": \"Одуванцик\"\n    },\n    {\n        \"id\": \"fb17d37d-e567-421c-805b-4e2e812c1cf7\",\n        \"name\": \"Одуванцик\"\n    },\n    {\n        \"id\": \"fe7b2772-ab94-4248-b32a-ed2da932730d\",\n        \"name\": \"Одуванцик\"\n    },\n    {\n        \"id\": \"3dd6b287-e47b-4cb2-9677-57ae4029d8e7\",\n        \"name\": \"Одуванцик\"\n    },\n    {\n        \"id\": \"fea12912-a5e4-4a65-bff1-43533daefe68\",\n        \"name\": \"Одуванцик 10.0\"\n    },\n    {\n        \"id\": \"2044d5e5-7206-4813-9533-ac89f20409b3\",\n        \"name\": \"Одуванцикsdfbdfgnnrtfh\"\n    }\n]\n\n ```",
        "operationId": "usersIdAddableCompaniesSearchSearch",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/users/schedule_delete": {
      "delete": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/schedule_delete",
        "description": "**Запланированное удаление пользователя из системы.**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\nМетод запланирует удаление на 24 часа, а в ответ на метод выдается сообщение\n\n200:\n\n```\n{\n  \"msg\": \"Мы запланировали удаление вашего аккаунта. У вас есть 24 часа чтобы отменить удаление по ссылке, которую мы вам отправили на почту.\"\n}\n\n ```",
        "operationId": "usersScheduleDelete",
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/users/schedule_delete": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/users/{id}/create_token": {
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users/:id/create_token",
        "description": "**Создание пользовательского API_KEY для конкретной компании**\n\n---\n\nВы можете предоставить доступ только тем пользователям, у которых есть только одна компания и роль ниже администратора.\n\n**Параметры запроса:**\n\nid - Id пользователя\n\n**В теле запроса:**\n\nvalid_to - срок действия ключа (ссылки).\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nPOST /users/8462404e-99a9-4226-ae14-2f59e0400768/create_token\n\n``` json\n{\n    \"valid_to\": \"2024-06-21 15:00:00\"\n}\n\n ```\n\nПоле user_company_api_key возвращает ключ, который можно отправлять в запросах в заголовке user_company_api_key.\n\nПоле url возвращает ссылку для авторизации пользователя в компании.\n\n**Пример ответа:**\n\n``` json\n{\n  \"user_company_api_key\": \"{{vault:json-web-token}}\",\n  \"url\": \"https://api.skif.pro/api_v1/login?user_company_api_key={{vault:json-web-token}}\"\n}\n\n ```",
        "operationId": "usersIdCreateToken",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "valid_to": {
                    "type": "string",
                    "example": "2024-06-21 15:00:00"
                  }
                }
              },
              "examples": {
                "/users/:id/create_token": {
                  "value": {
                    "valid_to": "2024-06-21 15:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/me/settings": {
      "get": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/me/settings?company_id=<company_id>",
        "description": "**Получение пользовательских настроек для текущего пользователя**\n\nПараметр запроса company_id - ID компании, необязательное поле. Если указано, настройки возвращаются только для этой компании.\n\n---\n\n**Описание поля в JSON:**\n\nkey - ключ настройки, строка\n\nvalue - значение настройки, строка\n\nversion - версия настройки, целое число\n\n**Пример**:\n\n```\n[\n    {\n        \"id\": \"d6e6d77d-46f3-4603-b3b8-abe85cb302b8\",\n        \"user_id\": \"a4b5fde8-9b70-4425-bd75-bde7f12c9f87\",\n        \"key\": \"show_item_in_moon\",\n        \"value\": \"0\",\n        \"version\": 1\n    },\n    {\n        \"id\": \"5b04c69c-1fe7-4815-8c3a-d1056a8b5b65\",\n        \"user_id\": \"a4b5fde8-9b70-4425-bd75-bde7f12c9f87\",\n        \"key\": \"show_geozones_in_road_xyz\",\n        \"value\": \"1\",\n        \"version\": 0\n    }\n]\n\n ```",
        "operationId": "meSettingsCompanyIdCompanyId",
        "parameters": [
          {
            "name": "cookie",
            "in": "header",
            "schema": {
              "type": "string",
              "example": "__ddg1_=iXH59Du4QaAkZvHblGsa; rl_user_id=%22RudderEncrypt%3AU2FsdGVkX1837SQcSoYSWGg1LPwUmHtV7ONZrz1BFryeqgVO6dXAKzEpKdMN3%2B1F%22; PLAY_SESSION={{vault:json-web-token}}"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader"
      },
      "put": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/me/settings",
        "description": "**Сохранение пользовательских настроек для текущего пользователя**\n\n---\n\n**Описание поля в JSON:**\n\n**key** - ключ настройки, строка. Для уникальных настроек, которые используются только в одном стенде, рекомендуется использовать префикс или суффикс. Например, show_geozones_on_map_web\n\n**value** - значение настройки, строка.\n\n**version** - версия настройки, целое число.\n\n**company_id -** ID компании, в который сохраняется настройка пользователя.\n\n**Пример запроса:**\n\n```\n{\n    \"key\": \"show_item_in_moon\",\n    \"value\": \"1\"\n}\n\n ```\n\nОтвет возвращает массив JSON: все настройки пользователя:\n\nПример:\n\n```\n[\n    {\n        \"id\": \"d6e6d77d-46f3-4603-b3b8-abe85cb302b8\",\n        \"user_id\": \"a4b5fde8-9b70-4425-bd75-bde7f12c9f87\",\n        \"key\": \"show_item_in_moon\",\n        \"value\": \"0\",\n        \"version\": 1\n    },\n    {\n        \"id\": \"5b04c69c-1fe7-4815-8c3a-d1056a8b5b65\",\n        \"user_id\": \"a4b5fde8-9b70-4425-bd75-bde7f12c9f87\",\n        \"key\": \"show_geozones_in_road_xyz\",\n        \"value\": \"1\",\n        \"version\": 0\n    }\n]\n\n ```\n\nСохранение настройки пользователя в компании:\n\n```\n{\n    \"key\": \"show_geozones_in_road_3\",\n    \"value\": \"1\",\n    \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\"\n}\n\n ```\n\nОтвет:\n\n```\n[\n    {\n        \"id\": \"48379173-7c56-457c-be29-f329fbd284c5\",\n        \"user_id\": \"a4b5fde8-9b70-4425-bd75-bde7f12c9f87\",\n        \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n        \"key\": \"show_geozones_in_road_xyz_ssssssssss\",\n        \"value\": \"1\",\n        \"version\": 0\n    },\n    {\n        \"id\": \"0ba785ce-5fcb-4b88-b8bc-88e0749de321\",\n        \"user_id\": \"a4b5fde8-9b70-4425-bd75-bde7f12c9f87\",\n        \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n        \"key\": \"show_geozones_in_road_3\",\n        \"value\": \"1\",\n        \"version\": 0\n    }\n]\n\n ```",
        "operationId": "meSettings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "string",
                    "example": "show_geozones_in_road_xyz"
                  },
                  "value": {
                    "type": "string",
                    "example": "1"
                  },
                  "version": {
                    "type": "number",
                    "example": 0
                  }
                }
              },
              "examples": {
                "/me/settings": {
                  "value": {
                    "key": "show_geozones_in_road_xyz",
                    "value": "1",
                    "version": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/change/user/{user_id}/company/{company_id}": {
      "get": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/change/user/:user_id/company/:company_id",
        "description": "**Возможность переключение под пользователем без запроса пароля**\n\n---\n\n**Параметры запроса:**\n\nuser_id - ID пользователя для переключения.\n\ncompany_id - ID компании для переключения.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n[https://admin-dev.skif.pro/api_v1/change/user/2f583b2b-a7d6-4d93-94b3-da6eedab69f0/company/459b2824-0035-499d-8062-baccb2ae5581](http://admin-dev.skif.pro/api_v1/change/user/2f583b2b-a7d6-4d93-94b3-da6eedab69f0/company/459b2824-0035-499d-8062-baccb2ae5581)\n\nВ результате пользователь перенаправляется на страницу в которой пользователь авторизуется под выбранным пользователем.\n\nДля авторизованного пользователя таким способом возвращается в GET /me поле `another_user: true`",
        "operationId": "changeUserUserIdCompanyCompanyId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": [
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID целевой компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "user_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        },
        {
          "name": "company_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/dictionaries/{dicType}": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Системные справочники (типы ТС, иконки)",
        "description": "**Получить все записи справочника Dictionary с указанным типом.**\n\n---\n\n**Описание параметров:**\n\ndicType - тип записей, которые необходимо получить.\n\nМожет принимать следующие значения:\n\nadmin_modules  \ncolor_code  \ncustomfield_groups  \nformula  \ngeo_icon  \ngeozone_type  \nnotification_type  \nperiodic_type  \nreport_template_table_grouping  \nreport_template_table_type  \nsensor_type  \nterminal_type  \ntrip_activation_type  \ntrip_passage_order_type  \nunit_icon  \nunit_type  \nweekdays_type\n\n---\n\n**Пример запроса:**\n\nGET /dictionaries/unit_type\n\nвозвращает все часовые пояса в формате (пример для английской локали):\n\n```\n[{\n    \"type\": \"unit_type\",\n    \"key\": \"farm_equipment\",\n    \"value\": \"Farm equipment\"\n}, {\n    \"type\": \"unit_type\",\n    \"key\": \"house\",\n    \"value\": \"House\"\n    }\n}]\n\n ```\n\n**Описание параметров ответа:**  \ntype - тип справочника,  \nkey - ключ справочника,  \nvalue - перевод справочника на язык пользователя\n\nВ случае отсутствия записей переданного типа возвращает пустой массив \\[\\]",
        "operationId": "dictionariesDictype",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "dicType",
            "in": "path",
            "required": true,
            "description": "Тип справочника",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "dicType",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/dictionaries/unit_type": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Справочник типов транспортных средств",
        "description": "**Получить все записи справочника Dictionary**\n\n---\n\nПример запроса:\n\nGET /dictionaries\n\nвозвращает все справочники (пример для английской локали) сортируя по type:\n\n```\n[{\n    \"key\": \"admin_geozones\",\n    \"type\": \"admin_modules\",\n    \"value\": \"Geozones\"\n},\n...\n {\n    \"type\": \"unit_type\",\n    \"key\": \"house\",\n    \"value\": \"House\"\n    }\n},\n...\n{\n    \"key\": \"monday\",\n    \"type\": \"weekdays_type\",\n    \"value\": \"Понедельник\"\n}\n]\n\n ```\n\n**Описание параметров ответа:**  \ntype - тип справочника, все возможные знечения:  \nadmin_modules  \ncolor_code  \ncustomfield_groups  \nformula  \ngeo_icon  \ngeozone_type  \nnotification_type  \nperiodic_type  \nreport_template_table_grouping  \nreport_template_table_type  \nsensor_type  \nterminal_type  \ntrip_activation_type  \ntrip_passage_order_type  \nunit_icon  \nunit_type  \nweekdays_type  \nkey - ключ справочника,  \nvalue - перевод справочника на язык пользователя",
        "operationId": "dictionaries",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/properties/{propertiesType}": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Свойства компании по категории",
        "description": "**Получить все записи справочника Properties с указанным типом.**\n\nСправочник 'Properties' предназначен ТОЛЬКО для микросервиса auth и включает в себя только информацию о юзере.\n\n---\n\n**Описание параметров:**\n\npropertiesType - тип записей, которые необходимо получить.\n\nМожет принмать следующие значения:\n\nlanguages (языки),\n\ntimezones (часовые пояса)\n\nroles (роли)\n\ndateformats (форматы даты)\n\ntimeformats (форматы времени)\n\n**Пример запроса:**\n\nGET /properties/timezones\n\nВозвращает все часовые пояса в формате (пример для английской локали):\n\n```\n[{\n    \"type\": \"timezones\",\n    \"key\": \"UTC+4:30\",\n    \"value\": \"Kabul, Afghanistan (+4:30)\"\n}, {\n    \"type\": \"timezones\",\n    \"key\": \"UTC+6:30\",\n    \"value\": \"Yangon, Myanmar (+6:30)\"\n    }\n}]\n\n ```\n\n**Описание параметров ответа:**  \ntype - тип справочника,  \nkey - ключ справочника,  \nvalue - перевод справочника на язык пользователя\n\nВ случае отсутствия записей переданного типа возвращает пустой массив \\[\\]",
        "operationId": "propertiesPropertiestype",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "propertiesType",
            "in": "path",
            "required": true,
            "description": "Категория свойств",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "propertiesType",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/properties": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Общие настройки и свойства компании",
        "description": "**Получить все записи справочника Properties**\n\nСправочник 'Properties' предназначен ТОЛЬКО для микросервиса auth и включает в себя только информацию о пользователе.\n\n---\n\n**Пример запроса:**\n\nGET /properties\n\nВозвращает все записи (пример для английской локали):\n\n```\n[{\n    \"key\": \"yyyy-MM-dd\",\n    \"type\": \"dateformats\",\n    \"value\": \"yyyy-MM-dd(2014-01-25, 1987-12-02)\"\n},\n...\n{\n    \"key\": \"NO_ACCESS\",\n    \"type\": \"roles\",\n    \"value\": \"NoAccess\"\n}\n...\n{\n    \"key\": \"UTC+5\",\n    \"type\": \"timezones\",\n    \"value\": \"(GMT + 05: 00) Yekaterinburg, Islamabad, Karachi, Tashkent\"\n}\n}]\n\n ```\n\n**Описание параметров ответа:**  \ntype - тип справочника, все возможные значения:\n\nlanguages - языки  \ntimezones - часовые пояса  \nroles - роли  \ndateformats - форматы даты  \ntimeformats - форматы времени  \nkey - ключ справочника  \nvalue - перевод справочника на язык пользователя",
        "operationId": "properties",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/access": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Проверка прав доступа текущего пользователя",
        "description": "**Получить доступ текущего пользователя к сущностям системы**\n\n---\n\n**Формат возвращаемых данных:**\n\n``` json\n{\n    \"edit_classes_fields\": [{  //доступ на редактирование к полям сущностей в целом\n        \"type\": \"users\",\n        \"fields\": [\"name\", \"photo\", \"email\", \"phone\", \"code\"]\n    }],\n    \"edit_objects_fields\": [{ //доступ на редактирование к полям конкретной сущности\n        \"type\": \"users\",\n        \"id\": \"23498320-32492-3294-23989487\",\n        \"fields\": [\"name\", \"photo\", \"email\", \"phone\", \"code\"]\n    }],\n    \"actions\": [\"btmCreateUser\", \"btmDeleteUser\", \"btmSendCommand\"]  //доступ к действиям\n}\n\n ```\n\n---\n\n**Описание параметров ответа:**\n\nedit_classes_fields - ключ тега, содержащий массив ограничений на редактирование к сущности\n\ntype - ключ сущности, возможные значения users, units, geozones, routes, report_templates, notifications_templates\n\nfields - массив полей доступных пользователю на редактирование\n\nedit_objects_fields - ключ тега, содержащий массив ограничений, на редактирование конкретных сущностей\n\nid - идентификатор сущности, к которой применяется ограничение\n\nactions - ключ тега, содержащий массив ключей действий, к которым имеет доступ пользователь\n\n---\n\nДоступ определяется на основании роли пользователя к текущей компании и сущностям, к которым он имеет эксклюзивный доступ (например, собственная карточка пользователя)",
        "operationId": "access",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/custom_fields": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Реестр пользовательских полей компании",
        "description": "**Запрос на получение обязательных custom_fields**\n\n---\n\nCustom_fields юнита делятся на 2 типа - обязательные и необязательные (кастомные).\n\nОбязательные **custom_fields** это поля, которые должны присутствовать у каждого юнита. При создании/изменении юнита лучше всего передавать эти обязательные поля со значениями, установленными юзером. Если бэкенд не обнаружит в юните какого-то обязательного поля, то оно будет создано в нём автоматически, значение будет взято из default_value.  \nБэкенд проверяет значения через паттерн. В случае не соответствия паттерну, будет выброшена ошибка.\n\nНеобязательные поля - произвольные поля, созданные юзером дополнительно. Никак не проверяются на стороне бэкенда. По состоянию на май 2020г. используются как поля для дополнительной информации (пояснительные) и не участвуют в каких-либо расчетах.\n\nCustom_field юнита имеет следующие параметры  \nname - имя поля, которое отображается в интерфейсе. У обязательных полей - не изменяемо (поэтому пытаться изменить его название в юните не имеет смысла). У НЕобяз. - изменяемое, произвольное.  \nkey - ключ **custom_fields**. Все поля определяются и распознаются бэкендом именно по ключу. У обяз.полей - ключ константный, у необяз. полей - ключ произвольный, договорились использовать key такой же как и name.  \nvalue - значение, которое пользователь присвоил этому кастом филду.\n\n---\n\n**Пример ответа:**\n\n```\n[\n    {\n        \"name\": \"Мин. объем заправки\",\n        \"key\": \"fuel_fillings_minfilling\",\n        \"default_value\": \"10\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 1,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Расход летом (л/100км.)\",\n        \"key\": \"fuel_consumption_summerconsump\",\n        \"default_value\": \"0\",\n        \"pattern\": \"^[0-9]*\\\\.?[0-9]+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 1,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Мин. время стоянки (сек)\",\n        \"key\": \"tripdetector_minparktime\",\n        \"default_value\": \"300\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_trips\",\n        \"values\": [],\n        \"sort\": 1,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Аналитик\",\n        \"key\": \"analyst\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 1,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Игнор-ть сообщ-я после начала движения\",\n        \"key\": \"fuel_fillings_msgignorestart\",\n        \"default_value\": \"60\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 2,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Расход зимой (л/100км.)\",\n        \"key\": \"fuel_consumption_winterconsump\",\n        \"default_value\": \"0\",\n        \"pattern\": \"^[0-9]*\\\\.?[0-9]+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 2,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Коэф. пробега\",\n        \"key\": \"advanced_mileagecoeff\",\n        \"default_value\": \"1\",\n        \"pattern\": \"^\\\\d{1,8}((,|.)\\\\d{1,8})?$\",\n        \"type\": \"text\",\n        \"group\": \"cf_trips\",\n        \"values\": [],\n        \"sort\": 2,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Установщик\",\n        \"key\": \"installer\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 2,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Мин. время остановки для опр-ия слива\",\n        \"key\": \"fuel_fillings_minstaytheft\",\n        \"default_value\": \"60\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 3,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"На холостом ходу летом (л./час.)\",\n        \"key\": \"fuel_math_idlingsummer\",\n        \"default_value\": \"0\",\n        \"pattern\": \"^[0-9]*\\\\.?[0-9]+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 3,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Мин. скорость движ-я (км/ч)\",\n        \"key\": \"tripdetector_minmovespeed\",\n        \"default_value\": \"3\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_trips\",\n        \"values\": [],\n        \"sort\": 3,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Мин. объем слива\",\n        \"key\": \"fuel_fillings_minitheft\",\n        \"default_value\": \"10\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 4,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"На холостом ходу зимой (л./час.)\",\n        \"key\": \"fuel_math_idlingwinter\",\n        \"default_value\": \"0\",\n        \"pattern\": \"^[0-9]*\\\\.?[0-9]+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 4,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Мин. расст-ие поездки (м)\",\n        \"key\": \"tripdetector_mintripdist\",\n        \"default_value\": \"100\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_trips\",\n        \"values\": [],\n        \"sort\": 4,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Дата установки(формат год-месяц-день, например 2019-03-07)\",\n        \"key\": \"install_date\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 4,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Коэф. при движении под нагрузкой\",\n        \"key\": \"fuel_math_coeffunderload\",\n        \"default_value\": \"0\",\n        \"pattern\": \"^[0-9]*\\\\.?[0-9]+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 5,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Макс. интервал между сообщ-ми (сек)\",\n        \"key\": \"advanced_maxintervalmsg\",\n        \"default_value\": \"3600\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_trips\",\n        \"values\": [],\n        \"sort\": 5,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Место установки в ТС\",\n        \"key\": \"install_place\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 5,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Первый месяц зимы (январь-1)\",\n        \"key\": \"fuel_consumption_winterfrom\",\n        \"default_value\": \"11\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 6,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Макс. расст-ие между сообщ-ми (м)\",\n        \"key\": \"tripdetector_maxdistancemsg\",\n        \"default_value\": \"1000\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_trips\",\n        \"values\": [],\n        \"sort\": 6,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Серийный номер терминала\",\n        \"key\": \"serial_number\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 6,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Последний месяц зимы (январь-1)\",\n        \"key\": \"fuel_consumption_winterto\",\n        \"default_value\": \"3\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 7,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Мин. время поездки (сек)\",\n        \"key\": \"tripdetector_mintriptime\",\n        \"default_value\": \"60\",\n        \"pattern\": \"^\\\\d+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_trips\",\n        \"values\": [],\n        \"sort\": 7,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Серийный номер ДУТ\",\n        \"key\": \"serial_number_dut\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 7,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Стоимость (1 л.)\",\n        \"key\": \"fuel_price\",\n        \"default_value\": \"0\",\n        \"pattern\": \"^[0-9]*\\\\.?[0-9]+$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 8,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Опр-ие движ-я\",\n        \"key\": \"key_tripdetector_movedetect\",\n        \"default_value\": \"speedkph\",\n        \"pattern\": \"^[a-zA-Zа-яА-Я\\\\.\\\\_]*$\",\n        \"type\": \"list\",\n        \"group\": \"cf_trips\",\n        \"values\": [\n            {\n                \"key\": \"speedkph\",\n                \"value\": \"Скорость\"\n            },\n            {\n                \"key\": \"ignition\",\n                \"value\": \"Зажигание\"\n            }\n        ],\n        \"sort\": 8,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Серийный номер пломбы ДУТ\",\n        \"key\": \"dut_seal_serial_number\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 8,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Определение пробега\",\n        \"key\": \"tripdetector_mileagedetect\",\n        \"default_value\": \"mileage_GPS\",\n        \"pattern\": \"^[a-zA-Zа-яА-Я\\\\.\\\\_]*$\",\n        \"type\": \"list\",\n        \"group\": \"cf_trips\",\n        \"values\": [\n            {\n                \"key\": \"mileage_GPS\",\n                \"value\": \"GPS\"\n            },\n            {\n                \"key\": \"mileage_mileage_sensor\",\n                \"value\": \"Cенсор\"\n            },\n            {\n                \"key\": \"mileage_relative_mileage\",\n                \"value\": \"Относительный пробег\"\n            },\n            {\n                \"key\": \"mileage_GPS_ignition\",\n                \"value\": \"GPS зажигание\"\n            }\n        ],\n        \"sort\": 9,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Гос номер\",\n        \"key\": \"license_plate_number\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 9,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Определение моточасов\",\n        \"key\": \"key_motohourdetector\",\n        \"default_value\": \"ignition\",\n        \"pattern\": \"^[a-zA-Zа-яА-Я\\\\.\\\\_]*$\",\n        \"type\": \"list\",\n        \"group\": \"cf_motohours\",\n        \"values\": [\n            {\n                \"key\": \"ignition\",\n                \"value\": \"Зажигание\"\n            },\n            {\n                \"key\": \"abs_motohours\",\n                \"value\": \"Абсолютные моточасы\"\n            },\n            {\n                \"key\": \"relative_motohours\",\n                \"value\": \"Относительные моточасы\"\n            }\n        ],\n        \"sort\": 10,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Норма часов в день\",\n        \"key\": \"hours_rate\",\n        \"default_value\": \"8\",\n        \"pattern\": \"^((2[0-4]|1[0-9]|[0-9])|((2[0-3]|1[0-9]|[0-9])\\\\.[0-9]+))$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 10,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Дата блокировки(формат год-месяц-день, например 2019-03-07)\",\n        \"key\": \"block_date\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 11,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"КП\",\n        \"key\": \"kp\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 12,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"ДУТ\",\n        \"key\": \"dut\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 13,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Вторая sim\",\n        \"key\": \"second_sim\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 14,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Серийный номер ДУТ 1\",\n        \"key\": \"serial_number_dut_1\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 15,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Серийный номер ДУТ 2\",\n        \"key\": \"serial_number_dut_2\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 16,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Марка машины\",\n        \"key\": \"brand_name\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 17,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Вид топлива (бенз., д/т)\",\n        \"key\": \"fuel_type\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 18,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Марка горючего\",\n        \"key\": \"fuel_mark\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_fuel\",\n        \"values\": [],\n        \"sort\": 19,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Код марки\",\n        \"key\": \"brand_code\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 20,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Видео устройство\",\n        \"key\": \"video_device_name\",\n        \"default_value\": \"\",\n        \"pattern\": \"^(?:|CARVIS)$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 21,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"ID-видео устройства\",\n        \"key\": \"video_device_id\",\n        \"default_value\": \"\",\n        \"pattern\": \"^.*$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 22,\n        \"show_in_monitoring\": false\n    },\n    {\n        \"name\": \"Камеры\",\n        \"key\": \"video_cameras\",\n        \"default_value\": \"\",\n        \"pattern\": \"^(|\\\\d+(?:[\\\\t]*,[\\\\t]*\\\\d+)*+)$\",\n        \"type\": \"text\",\n        \"group\": \"cf_etc\",\n        \"values\": [],\n        \"sort\": 23,\n        \"show_in_monitoring\": false,\n        \"hint\": \"Несколько числовых значений разделенных запятой, например 0,1,3,7\"\n    }\n]\n\n ```",
        "operationId": "customFields",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/messages": {
      "get": {
        "tags": [
          "Мониторинг"
        ],
        "summary": "/messages",
        "description": "**Получение изменений в справочниках**\n\n---\n\nИспользуется один вебсокет для получения следующих данных:\n\n1. Последнего сообщения от объекта\n\n2. Уведомлений за последние сутки\n\n3. Новых уведомлений\n\n4. Изменения справочников\n\n\nЕсли сервер использует протокол HTTP, то вебсокет должен работать по протоколу WS. Аналогично, если сервер использует HTTPS, то вебсокет должен работать по протоколу WSS.\n\nМожно также передать параметр `?from_time=1628259485000`, где значение — это метка времени в формате Unix (в часовом поясе пользователя). Это нужно, если вы хотите получить данные, начиная с определённого момента времени. Например, если у вас уже есть закэшированные данные на клиенте, и вы хотите получить только новые сообщения, начиная с этого времени.\n\n**Примеры:**\n\n1. Последнего сообщения от объекта\n\n\n```\n[\n    {\n        \"columns\": [\n            {\n                \"key\": \"unit_name\",\n                \"name\": \"Имя\",\n                \"value\": \"862531040000010\",\n                \"group\": \"main\"\n            },\n            {\n                \"key\": \"datepoint\",\n                \"name\": \"Был на связи\",\n                \"value\": \"2023-11-26 05:34:13\",\n                \"group\": \"main\"\n            },\n            {\n                \"key\": \"_datepoint\",\n                \"name\": \"_datepoint\",\n                \"value\": \"2023-11-26 05:34:13\",\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"_unix_timestamp\",\n                \"name\": \"_unix_timestamp\",\n                \"value\": 1700966053,\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"speed\",\n                \"name\": \"Скорость\",\n                \"value\": 0,\n                \"group\": \"gps\"\n            },\n            {\n                \"key\": \"satellites\",\n                \"name\": \"Спутники\",\n                \"value\": 17,\n                \"group\": \"gps\"\n            },\n            {\n                \"key\": \"_angle\",\n                \"name\": \"Угол\",\n                \"value\": 159,\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"address\",\n                \"name\": \"Адрес\",\n                \"value\": \"41.1201 44.8419\",\n                \"group\": \"gps\"\n            },\n            {\n                \"key\": \"_imei\",\n                \"name\": \"imei\",\n                \"value\": \"862531040000010\",\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"_marker_latlon\", //координаты, широта и долгота\n                \"name\": \"_marker_latlon\",\n                \"value\": [\n                    41.1200669,\n                    44.8419028\n                ],\n                \"group\": \"hidden\"\n            }\n        ],\n        \"unit_id\": \"363771f3-9769-4817-b986-b22ee9f37fdd\",\n        \"unit_name\": \"862531040000010\",\n        \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\"\n    }\n]\n\n ```\n\n```\n{\n    \"notify\": {\n        \"time\": \"2020-10-16 17:03:16\", //время изменений\n        \"objects\": \"units\", //изменяемая сущность - \"users\", \"units\", \"notifications\" и т.д.\n        \"operation\": \"PUT\", // операция изменения - PUT,POST,DELETE,PATCH\n        \"id\": \"9eb8b795-dfb0-46e7-a35d-0fc43512ba66\", //id изменяемой сущности\n        \"msg\": \"Оператор системы обновил объект\" //сообщение\n    }\n}\n\n ```\n\n---\n\n**Иконки для наглядного отображения состояния датчиков в мониторинге**\n\n---\n\nДобавляется новое поле `sensors_settings` (массив), если для компании были настроены датчики.\n\n```\n{\n    \"columns\": [\n        {\n            \"key\": \"unit_name\",\n            \"name\": \"Имя\",\n            \"value\": \"КамАЗ 5490 862531040000011\",\n            \"group\": \"main\"\n        },\n        {\n            \"key\": \"datepoint\",\n            \"name\": \"Был на связи\",\n            \"value\": \"2025-02-18 15:20:17\",\n            \"group\": \"main\"\n        },\n        ...\n    ],\n    \"sensors_settings\": [\n        {\n            \"name\": \"Уровень топлива\", // Название, по этому значению определяется\n            \"icon\": \"icon_fuel_level\", // иконка\n            \"sensor_name\": \"Топлива\",// Название найденного датчика\n            \"sensor_value\": 17, //Значение датчика\n            \"style_color\": \"#51AAEB\" // Цвет иконки рассчитывается на основе показаний датчика\n        }\n    ],\n    \"unit_id\": \"e037342f-e891-44d7-91b6-354ede0ef629\",\n    \"unit_name\": \"КамАЗ 5490\",\n    \"company_id\": \"3e70f167-9fad-4753-bуcf-d7d47c2c648c\"\n}\n\n ```",
        "operationId": "messages",
        "parameters": [
          {
            "name": "monitoring_filter",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "{\"conditions\":[{\"field\":\"name\",\"value\": \"Бензовоз\"},{\"field\":\"sensors.type.key\",\"value\": \"ignition\"}]}"
            }
          },
          {
            "name": "from_time",
            "in": "query",
            "required": false,
            "description": "Метка времени Unix (в миллисекундах) для получения новых сообщений с указанного момента",
            "schema": {
              "type": "integer",
              "format": "int64",
              "example": 1727337600000
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Observer",
        "x-rate-limit": "10 req/min"
      }
    },
    "/locator_msg": {
      "get": {
        "tags": [
          "Ссылки доступа (Локатор)",
          "Общее"
        ],
        "summary": "Получение телеметрии объекта по ссылке Локатора (Locator)",
        "description": "Публичный интерфейс опроса состояния и координат объекта, расшаренного через временную ссылку Локатора. Авторизация по UUID ссылки.",
        "operationId": "locatorMsgIdId",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "UUID ссылки локатора",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "f7a30642-e64e-419b-a040-5a39eb87ca4b"
            }
          },
          {
            "name": "from_time",
            "in": "query",
            "required": false,
            "description": "Начальный Unix timestamp в миллисекундах для инкрементального получения точек",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Текущие координаты и параметры объекта",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "unit_name": {
                      "type": "string",
                      "example": "КамАЗ 5490 (А123АА777)"
                    },
                    "datepoint": {
                      "type": "string",
                      "example": "2026-09-26 11:30:00"
                    },
                    "address": {
                      "type": "string",
                      "example": "г. Москва, ул. Промышленная, д. 12"
                    },
                    "latitude": {
                      "type": "number",
                      "example": 55.751244
                    },
                    "longitude": {
                      "type": "number",
                      "example": 37.618423
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api_v1/geocode/{address}": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Прямое геокодирование адреса",
        "description": "**Получение координат по адресу**",
        "operationId": "geocodeAddress",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Адресная строка для геокодирования",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "address",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/routing/{points}": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Построение маршрута по опорным точкам",
        "description": "**Построение маршрута, проходящего через указанные точки**\n\n---\n\nСтруктура запроса:  \npoints - Список точек в формате : latitude1,longitude1;latitude2,longitude2;...;latitudeN,longitudeN  \nМожно указать до 10 точек.\n\nСтруктура ответа, как в ответе на запрос /fastracks\n\nПример запроса:  \nGET /routing/76.928054,43.226996;76.913200,43.237085;76.887795,43.217677\n\n\nПример ответа:\n\n```\n{\n    \"columns\": [\n        {\n            \"key\": \"longitude\",\n            \"value\": \"Долгота\"\n        },\n        {\n            \"key\": \"latitude\",\n            \"value\": \"Широта\"\n        }\n    ],\n    \"values\": [\n        {\n            \"style\": \"style_0\",\n            \"points\": [\n                [\n                    43.22688,\n                    76.928102\n                ],\n                [\n                    43.22682,\n                    76.92688\n                ],\n                [\n                    43.226827,\n                    76.924814\n                ],\n                [\n                    43.22683,\n                    76.923471\n                ],\n                [\n                    43.22688,\n                    76.928102\n                ],\n                [\n                    43.22655,\n                    76.915747\n                ],\n                [\n                    43.228767,\n                    76.91545\n                ],\n                [\n                    43.231589,\n                    76.915042\n                ],\n                [\n                    43.235994,\n                    76.913977\n                ],\n                [\n                    43.22655,\n                    76.915747\n                ],\n                [\n                    43.236787,\n                    76.91353\n                ],\n                [\n                    43.236787,\n                    76.91353\n                ],\n                [\n                    43.236508,\n                    76.91167\n                ],\n                [\n                    43.236508,\n                    76.91167\n                ],\n                [\n                    43.237132,\n                    76.913191\n                ],\n                [\n                    43.237132,\n                    76.913191\n                ],\n                [\n                    43.237132,\n                    76.913191\n                ],\n                [\n                    43.236318,\n                    76.916238\n                ],\n                [\n                    43.236532,\n                    76.918205\n                ],\n                [\n                    43.237132,\n                    76.913191\n                ],\n                [\n                    43.236552,\n                    76.918459\n                ],\n                [\n                    43.236552,\n                    76.918459\n                ],\n                [\n                    43.237071,\n                    76.918404\n                ],\n                [\n                    43.237071,\n                    76.918404\n                ],\n                [\n                    43.237018,\n                    76.917373\n                ],\n                [\n                    43.237018,\n                    76.917373\n                ],\n                [\n                    43.236609,\n                    76.916195\n                ],\n                [\n                    43.236609,\n                    76.916195\n                ],\n                [\n                    43.236423,\n                    76.916222\n                ],\n                [\n                    43.236342,\n                    76.911073\n                ],\n                [\n                    43.236423,\n                    76.916222\n                ],\n                [\n                    43.235898,\n                    76.909104\n                ],\n                [\n                    43.235898,\n                    76.909104\n                ],\n                [\n                    43.235355,\n                    76.909171\n                ],\n                [\n                    43.233921,\n                    76.904739\n                ],\n                [\n                    43.23341,\n                    76.903425\n                ],\n                [\n                    43.232191,\n                    76.900306\n                ],\n                [\n                    43.231343,\n                    76.898147\n                ],\n                [\n                    43.231138,\n                    76.897599\n                ],\n                [\n                    43.230524,\n                    76.896052\n                ],\n                [\n                    43.230227,\n                    76.895309\n                ],\n                [\n                    43.229308,\n                    76.893823\n                ],\n                [\n                    43.228953,\n                    76.893265\n                ],\n                [\n                    43.228357,\n                    76.892376\n                ],\n                [\n                    43.228289,\n                    76.892268\n                ],\n                [\n                    43.227905,\n                    76.89167\n                ],\n                [\n                    43.235355,\n                    76.909171\n                ],\n                [\n                    43.227609,\n                    76.891202\n                ],\n                [\n                    43.224853,\n                    76.891568\n                ],\n                [\n                    43.224363,\n                    76.891627\n                ],\n                [\n                    43.223981,\n                    76.891668\n                ],\n                [\n                    43.222661,\n                    76.891839\n                ],\n                [\n                    43.221646,\n                    76.892001\n                ],\n                [\n                    43.221156,\n                    76.89205\n                ],\n                [\n                    43.227609,\n                    76.891202\n                ],\n                [\n                    43.218662,\n                    76.892376\n                ],\n                [\n                    43.218381,\n                    76.8895\n                ],\n                [\n                    43.218332,\n                    76.888697\n                ],\n                [\n                    43.218662,\n                    76.892376\n                ],\n                [\n                    43.217725,\n                    76.887653\n                ],\n                [\n                    43.217725,\n                    76.887653\n                ]\n            ]\n        }\n    ]\n}\n\n ```",
        "operationId": "routingPoints",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "points",
            "in": "path",
            "required": true,
            "description": "Координаты точек через точку с запятой",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "points",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/geocode_search": {
      "post": {
        "tags": [
          "Общее"
        ],
        "summary": "Автодополнение и поиск адресов",
        "description": "**Поиск места по адресу**\n\n---\n\nЗапрос:\n\n``` json\n{\n    \"part\": \"Москва\"\n}\n\n ```\n\npart - часть текста\n\nСтруктура ответа:  \nJSON массив, где каждый элемент имеет следующие поля:  \n\\- name : Название места  \n\\- decription : Описание места  \n\\- pos : Координаты места в формате: \\[широта, долгота\\]\n\nПример запроса:\n\n``` json\n{\n    \"part\": \"Алма\"\n}\n\n ```\n\nПример ответа:\n\n``` json\n[\n    {\n        \"name\": \"Алматы\",\n        \"description\": \"Казахстан\",\n        \"pos\": [\n            76.945627,\n            43.237163\n        ]\n    },\n    {\n        \"name\": \"река Алма\",\n        \"description\": \"Амурская область, Россия\",\n        \"pos\": [\n            124.708934,\n            53.214184\n        ]\n    },\n    {\n        \"name\": \"Алма\",\n        \"description\": \"провинция Онтарио, Канада\",\n        \"pos\": [\n            -80.502192,\n            43.727401\n        ]\n    }\n]\n\n ```",
        "operationId": "geocodeSearch",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "part": {
                    "type": "string",
                    "example": "Алматы"
                  }
                }
              },
              "examples": {
                "/geocode_search": {
                  "value": {
                    "part": "Алматы"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/servers": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Список серверов и шлюзов приёма телеметрии",
        "description": "**Получение серверов по email пользователя**\n\n---\n\nПараметр body содержит следущие поля:\n\nemail (обязательный) - email пользователя\n\nget (необязательный) - возможные значения: \"ktzh\" - для получения серверов приложения КТЖ, \"all\" - для получения всех доступных серверов",
        "operationId": "serversBodyBody",
        "parameters": [
          {
            "name": "body",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/api_v1/points_geozones": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/points_geozones",
        "description": "**Получение точек с информацией о вхождении в геозоны**\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПример запроса:\n\n``` json\n{\n    \"model\": \"units\",\n    \"value\": \"тест\", // для поиска\n    \"from\": 0,\n    \"count\": 100\n}\n\n ```\n\nПример ответа:\n\n``` json\n {\n     \"max\": 2,\n     \"list\": [{\n         \"id\": \"53e57d49-4e98-4399-bbf2-b03964df68b7\",\n         \"name\": \"testName-777\",\n         \"imei\": \"e2f856c7-e7a9-4071-adb4-f76df176661b\",\n         \"company_id\": \"11111111-1111-1111-1111-111111111111\",\n         \"company_name\": \"companyName\"\n     }, {\n         \"id\": \"9e49f72f-1f1a-46c3-9e61-b61a5f9900ea\",\n         \"name\": \"testName-22222222\",\n         \"imei\": \"06ee6786-905b-4aa3-ac65-2a18054128ea\",\n         \"company_id\": \"11111111-1111-1111-1111-111111111111\",\n         \"company_name\": \"companyName\"\n     }]\n }\n\n ```",
        "operationId": "pointsGeozones",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2021-05-30 00:00:00"
                  },
                  "geozones": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "5b26edba-c04a-4db7-be99-548d67ec11dd"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "5b26edba-c04a-4db7-be99-548d67ec11dd"
                      },
                      {
                        "id": "c4714f7e-5c5e-4c85-982c-68ecef05fe8c"
                      },
                      {
                        "id": "d5f3cbfb-bfb6-4553-acb7-0a460327250c"
                      },
                      {
                        "id": "7c75f26e-c71a-4c0a-b289-106a9c466d91"
                      },
                      {
                        "id": "8ac9812f-4c5c-4047-a4e5-f8c7fa2ee187"
                      },
                      {
                        "id": "3397300d-186a-4a5e-a177-92158582cd06"
                      },
                      {
                        "id": "300c81d6-93fb-46f3-8722-7c00ab8c71b3"
                      },
                      {
                        "id": "0fb64256-197d-4ab0-902d-024261180fd8"
                      },
                      {
                        "id": "74ebea2b-5416-4f78-a009-1c0742882e44"
                      },
                      {
                        "id": "4b6d7108-20e4-4e5b-a6c3-ab1d39b6d2d0"
                      },
                      {
                        "id": "439feae2-ae51-497c-ac44-2e0fcfe21090"
                      },
                      {
                        "id": "506c5c93-c4ea-46ca-a562-45930b89cd8a"
                      },
                      {
                        "id": "50f8b4a9-9492-4a5d-b3c6-e9fdeb3f7a9a"
                      },
                      {
                        "id": "bc0fa345-099c-4e92-bbb1-7ff0cbec167c"
                      },
                      {
                        "id": "f1ce4edb-c5e1-48c7-849d-d0ee490eb6dc"
                      },
                      {
                        "id": "d2b8c61e-5237-4485-b0ae-da5463dbde7b"
                      },
                      {
                        "id": "a1e4c098-a94d-450a-8604-126c8bd8b342"
                      },
                      {
                        "id": "85db06e5-5d46-4029-a098-5128c9e129a5"
                      },
                      {
                        "id": "718ff4cf-23c9-4999-998a-9b051b0fbe4c"
                      },
                      {
                        "id": "8a2e9513-c121-4cdb-a66e-36fe85ae1789"
                      },
                      {
                        "id": "549b6340-8141-433f-af0e-304f806ed3ab"
                      },
                      {
                        "id": "775ea2bb-caae-48fa-a1ca-6a458a92d266"
                      },
                      {
                        "id": "1abf8dd0-67b5-454a-b3ee-4d5afcc916e9"
                      },
                      {
                        "id": "653fe0f2-0c30-456e-b3e1-b5ed0c4e6538"
                      },
                      {
                        "id": "4d605595-d4fc-4783-97fe-048d6cf43c68"
                      },
                      {
                        "id": "a553e2b7-9630-494e-ab86-cacbd58f049d"
                      },
                      {
                        "id": "ebab751d-85be-4ee4-9236-5446f94b75bc"
                      },
                      {
                        "id": "bf750153-5c8b-46fb-8117-7e6abb62af28"
                      },
                      {
                        "id": "470e8c3b-591b-418c-ba95-048bf4c9a0de"
                      },
                      {
                        "id": "14513bce-cb1a-4f11-9cd6-13c0e251e1e7"
                      },
                      {
                        "id": "764f6b18-a4b7-4d0d-a0fc-bd21209b8ad7"
                      },
                      {
                        "id": "860567e4-cafc-452f-96e8-75379090dc68"
                      },
                      {
                        "id": "937b98a9-b1c5-44cd-bfc5-b2a3c221d719"
                      },
                      {
                        "id": "5015cb6d-7ced-44d6-b2e6-8f1e42b6e274"
                      },
                      {
                        "id": "dd9aba62-2052-4314-858b-f7af64f55241"
                      },
                      {
                        "id": "96e8c566-a44c-4d25-8a3b-92129ca9e769"
                      },
                      {
                        "id": "22e6f850-74a5-41ec-9240-4801b56cb2c5"
                      },
                      {
                        "id": "bdaaeb4e-e7f6-4f7e-bdb6-a3abd85346da"
                      },
                      {
                        "id": "08c92a7a-518a-4d1f-a1d6-dbc9e9779477"
                      },
                      {
                        "id": "e8c7372f-d25d-4c81-bc18-6dc3dbccfbef"
                      },
                      {
                        "id": "bc2211b9-b5bb-4fff-be2c-6ff3cb6063f3"
                      },
                      {
                        "id": "0152ea99-a517-4351-be98-17a6ed4a41b0"
                      },
                      {
                        "id": "d950714a-7423-4567-b956-8562f2727823"
                      },
                      {
                        "id": "fe95b2b2-d5f8-4a6b-a8d7-f9ec6143f2d0"
                      },
                      {
                        "id": "e97e9b9c-4379-4905-a55c-e694302f69e9"
                      },
                      {
                        "id": "cd286c0f-3364-416d-8597-c221b0990be0"
                      },
                      {
                        "id": "71b4aab2-9e2c-4c2a-9865-665987b8b56c"
                      },
                      {
                        "id": "23ff5308-8159-48cb-9e02-9e9cd3ac2917"
                      },
                      {
                        "id": "94ba7820-cdb7-4e05-9968-34e97cf05951"
                      },
                      {
                        "id": "b8e4bca0-c867-47b2-a522-120913841003"
                      },
                      {
                        "id": "fcd04d6e-d523-4c18-8ee3-9ee6811ef94d"
                      },
                      {
                        "id": "9bf492fc-a261-429d-9021-03e27f7d6b70"
                      },
                      {
                        "id": "405dd1d9-6d0d-4346-8e02-03902a2fbdd9"
                      },
                      {
                        "id": "ea6246cc-569f-4185-b4e2-24811508caff"
                      },
                      {
                        "id": "0cecc132-39bb-4113-96b5-7e665d5f6177"
                      },
                      {
                        "id": "ff6619ba-2ea8-49dc-81d5-6dac1487eaff"
                      },
                      {
                        "id": "338eecfe-d989-4f7c-93e2-e2b370e3acfe"
                      },
                      {
                        "id": "898174d5-2f04-4b91-84d2-0034190da4a0"
                      },
                      {
                        "id": "679f5b9d-0cf6-41fe-837e-8781911f61de"
                      },
                      {
                        "id": "e4ef3cd8-7630-4df4-aead-8a2c7fe6b6e4"
                      },
                      {
                        "id": "b35247b4-a48c-4fcb-81e9-033d7230e19e"
                      },
                      {
                        "id": "f33f7b79-ef6c-4e40-acff-68407a8502b2"
                      },
                      {
                        "id": "22d7ed4c-ea97-4641-9977-b27d5f87bdc5"
                      },
                      {
                        "id": "79c99061-ea1a-49be-a027-c661bb326f42"
                      },
                      {
                        "id": "07356380-ba8d-4653-9847-30d6effa2948"
                      },
                      {
                        "id": "d4bf36b5-3480-42ff-83fe-73807c5e3aa3"
                      },
                      {
                        "id": "74ebea2b-5416-4f78-a009-1c0742882e44"
                      }
                    ]
                  },
                  "max": {
                    "type": "number",
                    "example": 100
                  },
                  "offset": {
                    "type": "number",
                    "example": 0
                  },
                  "to": {
                    "type": "string",
                    "example": "2021-05-30 10:00:00"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "03d98e39-0942-4c70-983b-405ad077ebbb"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "03d98e39-0942-4c70-983b-405ad077ebbb"
                      },
                      {
                        "id": "3d70f0f0-b3cc-4250-a688-8fd9a8018763"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/points_geozones": {
                  "value": {
                    "from": "2021-05-30 00:00:00",
                    "geozones": [
                      {
                        "id": "5b26edba-c04a-4db7-be99-548d67ec11dd"
                      },
                      {
                        "id": "c4714f7e-5c5e-4c85-982c-68ecef05fe8c"
                      },
                      {
                        "id": "d5f3cbfb-bfb6-4553-acb7-0a460327250c"
                      },
                      {
                        "id": "7c75f26e-c71a-4c0a-b289-106a9c466d91"
                      },
                      {
                        "id": "8ac9812f-4c5c-4047-a4e5-f8c7fa2ee187"
                      },
                      {
                        "id": "3397300d-186a-4a5e-a177-92158582cd06"
                      },
                      {
                        "id": "300c81d6-93fb-46f3-8722-7c00ab8c71b3"
                      },
                      {
                        "id": "0fb64256-197d-4ab0-902d-024261180fd8"
                      },
                      {
                        "id": "74ebea2b-5416-4f78-a009-1c0742882e44"
                      },
                      {
                        "id": "4b6d7108-20e4-4e5b-a6c3-ab1d39b6d2d0"
                      },
                      {
                        "id": "439feae2-ae51-497c-ac44-2e0fcfe21090"
                      },
                      {
                        "id": "506c5c93-c4ea-46ca-a562-45930b89cd8a"
                      },
                      {
                        "id": "50f8b4a9-9492-4a5d-b3c6-e9fdeb3f7a9a"
                      },
                      {
                        "id": "bc0fa345-099c-4e92-bbb1-7ff0cbec167c"
                      },
                      {
                        "id": "f1ce4edb-c5e1-48c7-849d-d0ee490eb6dc"
                      },
                      {
                        "id": "d2b8c61e-5237-4485-b0ae-da5463dbde7b"
                      },
                      {
                        "id": "a1e4c098-a94d-450a-8604-126c8bd8b342"
                      },
                      {
                        "id": "85db06e5-5d46-4029-a098-5128c9e129a5"
                      },
                      {
                        "id": "718ff4cf-23c9-4999-998a-9b051b0fbe4c"
                      },
                      {
                        "id": "8a2e9513-c121-4cdb-a66e-36fe85ae1789"
                      },
                      {
                        "id": "549b6340-8141-433f-af0e-304f806ed3ab"
                      },
                      {
                        "id": "775ea2bb-caae-48fa-a1ca-6a458a92d266"
                      },
                      {
                        "id": "1abf8dd0-67b5-454a-b3ee-4d5afcc916e9"
                      },
                      {
                        "id": "653fe0f2-0c30-456e-b3e1-b5ed0c4e6538"
                      },
                      {
                        "id": "4d605595-d4fc-4783-97fe-048d6cf43c68"
                      },
                      {
                        "id": "a553e2b7-9630-494e-ab86-cacbd58f049d"
                      },
                      {
                        "id": "ebab751d-85be-4ee4-9236-5446f94b75bc"
                      },
                      {
                        "id": "bf750153-5c8b-46fb-8117-7e6abb62af28"
                      },
                      {
                        "id": "470e8c3b-591b-418c-ba95-048bf4c9a0de"
                      },
                      {
                        "id": "14513bce-cb1a-4f11-9cd6-13c0e251e1e7"
                      },
                      {
                        "id": "764f6b18-a4b7-4d0d-a0fc-bd21209b8ad7"
                      },
                      {
                        "id": "860567e4-cafc-452f-96e8-75379090dc68"
                      },
                      {
                        "id": "937b98a9-b1c5-44cd-bfc5-b2a3c221d719"
                      },
                      {
                        "id": "5015cb6d-7ced-44d6-b2e6-8f1e42b6e274"
                      },
                      {
                        "id": "dd9aba62-2052-4314-858b-f7af64f55241"
                      },
                      {
                        "id": "96e8c566-a44c-4d25-8a3b-92129ca9e769"
                      },
                      {
                        "id": "22e6f850-74a5-41ec-9240-4801b56cb2c5"
                      },
                      {
                        "id": "bdaaeb4e-e7f6-4f7e-bdb6-a3abd85346da"
                      },
                      {
                        "id": "08c92a7a-518a-4d1f-a1d6-dbc9e9779477"
                      },
                      {
                        "id": "e8c7372f-d25d-4c81-bc18-6dc3dbccfbef"
                      },
                      {
                        "id": "bc2211b9-b5bb-4fff-be2c-6ff3cb6063f3"
                      },
                      {
                        "id": "0152ea99-a517-4351-be98-17a6ed4a41b0"
                      },
                      {
                        "id": "d950714a-7423-4567-b956-8562f2727823"
                      },
                      {
                        "id": "fe95b2b2-d5f8-4a6b-a8d7-f9ec6143f2d0"
                      },
                      {
                        "id": "e97e9b9c-4379-4905-a55c-e694302f69e9"
                      },
                      {
                        "id": "cd286c0f-3364-416d-8597-c221b0990be0"
                      },
                      {
                        "id": "71b4aab2-9e2c-4c2a-9865-665987b8b56c"
                      },
                      {
                        "id": "23ff5308-8159-48cb-9e02-9e9cd3ac2917"
                      },
                      {
                        "id": "94ba7820-cdb7-4e05-9968-34e97cf05951"
                      },
                      {
                        "id": "b8e4bca0-c867-47b2-a522-120913841003"
                      },
                      {
                        "id": "fcd04d6e-d523-4c18-8ee3-9ee6811ef94d"
                      },
                      {
                        "id": "9bf492fc-a261-429d-9021-03e27f7d6b70"
                      },
                      {
                        "id": "405dd1d9-6d0d-4346-8e02-03902a2fbdd9"
                      },
                      {
                        "id": "ea6246cc-569f-4185-b4e2-24811508caff"
                      },
                      {
                        "id": "0cecc132-39bb-4113-96b5-7e665d5f6177"
                      },
                      {
                        "id": "ff6619ba-2ea8-49dc-81d5-6dac1487eaff"
                      },
                      {
                        "id": "338eecfe-d989-4f7c-93e2-e2b370e3acfe"
                      },
                      {
                        "id": "898174d5-2f04-4b91-84d2-0034190da4a0"
                      },
                      {
                        "id": "679f5b9d-0cf6-41fe-837e-8781911f61de"
                      },
                      {
                        "id": "e4ef3cd8-7630-4df4-aead-8a2c7fe6b6e4"
                      },
                      {
                        "id": "b35247b4-a48c-4fcb-81e9-033d7230e19e"
                      },
                      {
                        "id": "f33f7b79-ef6c-4e40-acff-68407a8502b2"
                      },
                      {
                        "id": "22d7ed4c-ea97-4641-9977-b27d5f87bdc5"
                      },
                      {
                        "id": "79c99061-ea1a-49be-a027-c661bb326f42"
                      },
                      {
                        "id": "07356380-ba8d-4653-9847-30d6effa2948"
                      },
                      {
                        "id": "d4bf36b5-3480-42ff-83fe-73807c5e3aa3"
                      },
                      {
                        "id": "74ebea2b-5416-4f78-a009-1c0742882e44"
                      }
                    ],
                    "max": 100,
                    "offset": 0,
                    "to": "2021-05-30 10:00:00",
                    "units": [
                      {
                        "id": "03d98e39-0942-4c70-983b-405ad077ebbb"
                      },
                      {
                        "id": "3d70f0f0-b3cc-4250-a688-8fd9a8018763"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/copy": {
      "post": {
        "tags": [
          "Общее"
        ],
        "summary": "Клонирование конфигурации сущностей",
        "description": "**Копирует сущности из одной компании в другую (пока реализовано для units, geozones и reports_templates)**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\nПримеры запросов:\n\nКопирование в 1 компанию:\n\n``` json\n{\n    \"type\": \"units\",\n    \"ids\": [\"b92f5e06-ee48-4a08-8647-d805465e7be8\", \"b5298b57-df70-405e-b2b6-071ed230d36c\"],\n    \"to_company_id\": \"0aa10a42-fc54-497c-a54b-3295e4633348\"\n}\n\n ```\n\nМожно копировать в несколько компаний:\n\n``` json\n{\n    \"type\": \"units\",\n    \"ids\": [\"b92f5e06-ee48-4a08-8647-d805465e7be8\", \"b5298b57-df70-405e-b2b6-071ed230d36c\"],\n    \"to_company_id\": [\"0aa10a42-fc54-497c-a54b-3295e4633348\", \"qffa142-fc54-497c-a54b-3295e4633348\" ]\n}\n\n ```\n\nА чтобы копировать все сущности c другой компании:\n\n``` json\n{\n    \"type\": \"units\",\n    \"from_company_id\": \"b92f5e06-ee48-4a08-8647-d805465e7be8\",\n    \"to_company_id\": \"0aa10a42-fc54-497c-a54b-3295e4633348\"\n}\n\n ```\n\nТакже можно скопировать в несколько компаний:\n\n``` json\n{\n    \"type\": \"units\",\n    \"from_company_id\": \"b92f5e06-ee48-4a08-8647-d805465e7be8\",\n    \"to_company_id\": [\"0aa10a42-fc54-497c-a54b-3295e4633348\", \"qffa142-fc54-497c-a54b-3295e4633348\"]\n}\n\n ```\n\nВозможные значения type - \"units\", \"geozones\" или \"report_templates\" ( в будущем будут: \"unitsgroup\", \"units\", \"geozones\", \"notifications\", \"routes\", \"trailers\", \"mailings\")\n\nids - id сущностей, которые нужно скопировать в другую компанию.\n\nfrom_company_id - id компании, c которой нужно скопировать все сущности.\n\nto_company_id - id компании, в которую нужно скопировать сущности.\n\nВ случае успеха возвращается код 200, иначе текст ошибки.",
        "operationId": "copy",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "d20f1b59-85c3-46a2-b90e-5915fcdda7cb"
                    },
                    "example": [
                      "d20f1b59-85c3-46a2-b90e-5915fcdda7cb"
                    ]
                  },
                  "to_company_id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "type": {
                    "type": "string",
                    "example": "units"
                  }
                }
              },
              "examples": {
                "/copy": {
                  "value": {
                    "ids": [
                      "d20f1b59-85c3-46a2-b90e-5915fcdda7cb"
                    ],
                    "to_company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "type": "units"
                  }
                },
                "/sessions_excel": {
                  "value": {
                    "ids": [
                      "d20f1b59-85c3-46a2-b90e-5915fcdda7cb"
                    ],
                    "to_company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "type": "units"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/restore": {
      "post": {
        "tags": [
          "Общее"
        ],
        "summary": "Восстановление конфигурации из бэкапа",
        "description": "**Восстанавливает сущности (пока реализовано для units)**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\nПример запроса:\n\n```\n{\n    \"type\": \"units\",\n    \"ids\": [\"b92f5e06-ee48-4a08-8647-d805465e7be8\", \"b5298b57-df70-405e-b2b6-071ed230d36c\"]\n}\n\n ```\n\nВозможные значения type - \"units\" ( в будущем будут: \"unitsgroup\", \"units\", \"geozones\", \"report_templates\", \"notifications\", \"routes\", \"trailers\", \"mailings\")\n\nids - id сущностей, которые нужно востановить.\n\nВ случае успеха возвращается код 200, иначе текст ошибки.",
        "operationId": "restore",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "afcbb296-ce2b-403b-8e1e-f3c12e6f108c"
                    },
                    "example": [
                      "afcbb296-ce2b-403b-8e1e-f3c12e6f108c"
                    ]
                  },
                  "type": {
                    "type": "string",
                    "example": "units"
                  }
                }
              },
              "examples": {
                "/restore": {
                  "value": {
                    "ids": [
                      "afcbb296-ce2b-403b-8e1e-f3c12e6f108c"
                    ],
                    "type": "units"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "superadmin",
        "x-rate-limit": "10 req/min",
        "x-internal": true,
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/admin_query": {
      "post": {
        "tags": [
          "Терминалы"
        ],
        "summary": "Административный кросс-компанейский поиск сущностей",
        "description": "Поиск и фильтрация сущностей платформы (терминалы, объекты, группы, геозоны) по всем организациям с поддержкой сложных условий.",
        "operationId": "adminQuery",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "imei"
                        },
                        "value": {
                          "type": "string",
                          "example": "862531040000012"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "imei",
                        "value": "862531040000012"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 100
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "model": {
                    "type": "string",
                    "example": "commands"
                  }
                }
              },
              "examples": {
                "/admin_query": {
                  "value": {
                    "conditions": [
                      {
                        "field": "imei",
                        "value": "862531040000012"
                      }
                    ],
                    "count": 100,
                    "from": 0,
                    "model": "commands"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/auth_admin_query": {
      "post": {
        "tags": [
          "Общее"
        ],
        "summary": "Универсальный запрос к сервису авторизации",
        "description": "**Получения сущностей по всем компаниям для** **users и companies**\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПримеры запросов:\n\n```\n{\n    \"model\": \"units\",\n    \"value\": \"тест\", /для поиска\n    \"from\": 0,\n    \"count\": 100\n}\n\n ```\n\nВозможные значения model - \"users\", \"companies\"\n\nЧтобы фильтровать по интегратору надо отправить в запросе поле dealer. Достаточно указать id.\n\n\"dealer\": {\"id\": \"8a7d85f9-156e-41ab-9534-da71d1847cba\"}\n\nПример ответа:\n\n```\n {\n{\n    \"max\": 531,\n    \"list\": [\n        {\n            \"id\": \"2a004e29-0ca2-4f28-8a23-2ffb5392fd43\",\n            \"name\": \"Company\",\n            \"timezone_key\": \"UTC+3\"\n        },\n        {\n            \"id\": \"06187e4b-3059-4da1-aa2f-89da732d2b2f\",\n            \"name\": \"Company\",\n            \"timezone_key\": \"UTC+3\"\n        },\n...\n\n ```\n\n---\n\nДля model \"users\":\n\n\"fields\": [\"id\", \"name\", \"email\", \"is_driver\"] - поля, которые нужно вернуть. Возможные значения: id, name, email, phone, code, details, telegram_chat_id, is_driver, companies, dealers. По умолчанию id, name, email.\n\n\"is_driver\": признак водителя, true или false. Возвращается, если указан в fields.\n\n\"conditions\": [{\"field\": \"is_driver\", \"value\": \"true\"}] - только водители; [{\"field\": \"role_key\", \"values\": [\"ADMIN\", \"EDITOR\"]}] - пользователи, у которых хотя бы в одной компании есть одна из этих ролей. Роли передаются списком values.",
        "operationId": "authAdminQuery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "count": {
                    "type": "number",
                    "example": 100
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "fields": {
                    "type": "array",
                    "description": "Поля ответа для model users: id, name, email, phone, code, details, telegram_chat_id, is_driver, companies, dealers",
                    "items": {
                      "type": "string"
                    },
                    "example": [
                      "id",
                      "name",
                      "is_driver"
                    ]
                  },
                  "conditions": {
                    "type": "array",
                    "description": "Условия для model users: is_driver (value) и role_key (values)",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "is_driver"
                        },
                        "value": {
                          "type": "string",
                          "example": "true"
                        },
                        "values": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  },
                  "model": {
                    "type": "string",
                    "example": "companies"
                  }
                }
              },
              "examples": {
                "/auth_admin_query": {
                  "value": {
                    "count": 100,
                    "from": 0,
                    "model": "companies"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "superadmin",
        "x-rate-limit": "20 req/min",
        "x-internal": true,
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/attachments": {
      "post": {
        "tags": [
          "Общее"
        ],
        "summary": "Загрузка файла-вложения",
        "description": "**Добавление вложения, которое можно будет использовать в теге attachments для таблиц шаблонов**\n\n---\n\nсм. POST /report_templates и PUT /report_templates/:template_id\n\nСохраняет файлы на диске, присваивая ему id.  \nФайлы сохраняются с именами:  \n\"/attachments/\" + attachment.id + \".\" + extension\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**  \nВозвращается модель вложения\n\n```\n{\n    \"id\": \"80a201ea-67e5-4cd9-aea5-591128d2855a\", //его id\n    \"created\": \"2017-11-16 23:41:44\", //дата создания\n    \"name\": \"test.doc\", //переданное название файла\n    \"url\": \"/attachments/80a201ea-67e5-4cd9-aea5-591128d2855a.doc\" //путь, по которому доступен файл\n}\n\n ```\n\nДля получения вложения нужно использовать запрос GET /attachments/80a201ea-67e5-4cd9-aea5-591128d2855a.doc",
        "operationId": "attachments",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "30 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/attachments/{id}": {
      "get": {
        "tags": [
          "Общее"
        ],
        "summary": "Скачивание вложения по ID",
        "description": "**Получение вложения**\n\n---\n\nПосле создания вложения через метод POST /attachments возвращается json c url - его нужно использовать для получения файла",
        "operationId": "attachmentsId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID сущности",
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/cancel_delete/{id}": {
      "put": {
        "tags": [
          "Общее"
        ],
        "summary": "Восстановление удаленного объекта мониторинга",
        "description": "**Отмена запроса удаления по уникальному ID**\n\n---\n\nЭтот ID приходит в теле ответа на запрос удаления. см. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**  \nPUT /cancel_delete/80a201ea-67e5-4cd9-aea5-591128d2855a.doc\n\nВозвращает 200 в случае успешной отмены, в противном случае - 422 с текстом ошибки.",
        "operationId": "cancelDeleteId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID удаленного объекта мониторинга",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/auth_cancel_delete/{id}": {
      "put": {
        "tags": [
          "Общее"
        ],
        "summary": "Восстановление удаленного пользователя/роли",
        "description": "**Отмена запроса на удаление по уникальному ID**\n\n---\n\nЭтот ID приходит в теле ответа на запрос удаления. см. DELETE /company/users?ids=:ids\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**  \nPUT /auth_cancel_delete/80a201ea-67e5-4cd9-aea5-591128d2855a.doc\n\nВозвращает 200 в случае успешной отмены, в противном случае - 422 с текстом ошибки.",
        "operationId": "authCancelDeleteId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID удаленного пользователя/роли",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/mtracker_cancel_delete/{id}": {
      "put": {
        "tags": [
          "Общее"
        ],
        "summary": "Восстановление удаленного мобильного трекера",
        "description": "**Отмена запроса на удаление по уникальному ID.**\n\n---\n\nУникальный ID приходит в теле ответа на запрос уделения.\n\nсм. DELETE /terminals?ids=:ids или DELETE /retranslators?ids=:ids\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**  \nPUT /mtracker_cancel_delete/80a201ea-67e5-4cd9-aea5-591128d2855a.doc\n\nВозвращает 200 в случае успешной отмены, в противном случае - 422 с текстом ошибки.",
        "operationId": "mtrackerCancelDeleteId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID удаленного мобильного трекера",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/support": {
      "post": {
        "tags": [
          "Общее"
        ],
        "summary": "Отправка тикета в техподдержку",
        "description": "**Отправка письма в поддержку интегратора**\n\n---\n\nТело запроса:\n\n```\n{\n    \"subject\": \"тема письма\",\n    \"body\": \"текст сообщения\"\n}\n\n ```\n\nСообщение отправляется всем сотрудникам интегратора с ролью \"Редактор тарифа\".  \nОтправка доступна всем пользователям Компании.",
        "operationId": "support",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "body": {
                    "type": "string",
                    "example": "Как дела? Как создать объект?"
                  },
                  "subject": {
                    "type": "string",
                    "example": "Привет"
                  }
                }
              },
              "examples": {
                "/support": {
                  "value": {
                    "body": "Как дела? Как создать объект?",
                    "subject": "Привет"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "reader",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/company/users/{id}": {
      "delete": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/users/:id",
        "description": "**Удаление пользователя из компании**\n\n---\n\n**Параметры:**\n\nid - ID пользователя\n\nВ админ панеле можно удалить из определенных компаний с укзанием списка компаний в поле companies\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n``` json\n{\n  \"companies\": [\n    {\n      \"id\": \"545c61a4-27ae-4335-a18e-e63e98b3eceb\"\n    },\n    {\n      \"id\": \"6b596675-81ba-4916-ac2d-32388da57e6d\"\n    },\n    {\n      \"id\": \"6c08dd40-950a-4d7e-86ee-aa8f12435ed7\"\n    }\n  ]\n}\n\n ```\n\n---\n\n---\n\nОтвет: Пусто 200  \nЕсли пользователь с таким id не найден, то возвращается ошибка 400\n\n```\n{\n  \"id\": [\n    \"Недопустимый параметр\"\n  ]\n}\n\n ```",
        "operationId": "companyUsersId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "545c61a4-27ae-4335-a18e-e63e98b3eceb"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "545c61a4-27ae-4335-a18e-e63e98b3eceb"
                      },
                      {
                        "id": "6b596675-81ba-4916-ac2d-32388da57e6d"
                      },
                      {
                        "id": "6c08dd40-950a-4d7e-86ee-aa8f12435ed7"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/company/users/:id": {
                  "value": {
                    "companies": [
                      {
                        "id": "545c61a4-27ae-4335-a18e-e63e98b3eceb"
                      },
                      {
                        "id": "6b596675-81ba-4916-ac2d-32388da57e6d"
                      },
                      {
                        "id": "6c08dd40-950a-4d7e-86ee-aa8f12435ed7"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID пользователя для исключения из компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID пользователя"
        }
      ]
    },
    "/api_v1/company/users": {
      "delete": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/users?ids=:ids",
        "description": "**Планирует удаление пользователя с доступом к текущей компании по их id.**\n\n---\n\nЕсли пользователь удаляется из последней компании, то создается новая компания, где у него роль Admin.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**  \nDELETE /company/users?ids=456dc493-5983-478b-90cc-5bca0bfe708c,05f6bb8b-84cf-4553-951a-c5cca0be7220\n\n---\n\n**Параметры:**\n\nids - список Id пользователей\n\nПользователь должен обладать правами Admin, иначе возвращается ошибка 403.\n\n---\n\n**Ответ:**\n\nСтатус 200. В теле ответа id задачи на удаление, с помощью которого можно отменить удаление через роут PUT auth_cancel_delete/:id  \nЕсли хотя бы один пользователь с таким id не найден, то возвращается ошибка 400\n\n```\n{\n  \"id\": [\n    \"Недопустимый параметр\"\n  ]\n}\n\n ```",
        "operationId": "companyUsersIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin"
      }
    },
    "/api_v1/company/change/{id}": {
      "get": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/change/:id",
        "description": "**Переключение в компанию по ссылке**\n\n---\n\nВ cookies пользователя сохраняется сессия компании, переданная через параметр `:id`, после чего происходит перенаправление на главную страницу приложения.",
        "operationId": "companyChangeId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании, на которую переключается активная сессия",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/change/:id",
        "description": "**Выбор компании пользователем**\n\n---\n\nВ cookies пользователя прописывается новая сессия\n\n---\n\n**Пример запроса:**\n\nВ качестве id может использоваться только id доступной пользователю компании из списка companies в сущности user, см GET /me\n\n**Параметры:**\n\nid - id доступной компании пользователя.\n\n---\n\n**Ответ:**\n\nВозвращает код 200:\n\n```\n{\n    \"id\": \"75bd17cc-642f-4c7c-982e-e0e991907733\"\n}\n\n ```\n\nВозвращает код 422 в случае если id не валидно:\n\n```\n{\n    \"code\": 4022,\n    \"field\": \"id\",\n    \"message\": \"Вы не имеете доступа к выбранной компании, попробуйте перезайти.\"\n}\n\n ```",
        "operationId": "companyChangeId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании, на которую переключается активная сессия",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/company/{id}": {
      "put": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id",
        "description": "**Изменение параметров компании**\n\n---\n\nИзменяет атрибуты компании. Доступно только для пользователей, у которых доступ к компании на уровне Admin.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nВ качестве id может использоваться только id доступной пользователю компании из списка companies в сущности user, см GET /me\n\n```\n{\n    'name': 'newCompanyName',\n    'auto_kill_sessions': 20,\n    'strong_password': true\n    'timezone': { 'key': 'UTC+4' },\n    'holidays': [\n        {'year': 2020, 'days': ['01.01', '01.02', '03.08', '04.13', '04.14']},\n         {'year': 2021, 'days': ['01.01', '01.02', '03.08', '04.15', '04.16']}\n    ],\n    \"properties\": { // настройки для компании\n        \"action_templates\": [// шаблоны actions\n            {\n                \"name\": \"Шаблон1\", // имя шаблона\n                \"is_unit_action\": false,// true если относится к объектам.\n                \"actions\": [// список actions, см. GET /actions\n                    {\"id\": \"e80c59b0-2c80-4bea-969c-498db4b0d446\"},\n                    {\"id\": \"62e20acf-cab3-4e8d-9e1f-e8774cf10764\"}\n                ]\n            },\n             {\n                \"name\": \"Шаблон2\", // имя шаблона\n                \"is_unit_action\": true,// true если относится к объектам.\n                \"actions\": [// список actions, см. GET /actions\n                    {\"id\": \"7d0ca86a-66e2-473b-8f4c-a61cc3e40649\"},\n                    {\"id\": \"9259c55d-7e1c-45a2-ab3e-c98aef52a1f5\"}\n                ]\n            }\n        ]\n    }\n}\n\n ```\n\n**Параметры:**\n\n```\nid - id доступной компании пользователя\nname - имя компании\nauto_kill_sessions - минуты, срок жизни сессии,\nstrong_password - true, если компания использует сложный пароль, иначе false\ninteger, если 0 то сессии живут бесконечно для пользователей компании\ntimezone - часовой пояс компании\ndateformat - формат даты для компании, выбирается из результата запроса /properties/dateformats\ntimeformat - формат времени для компании, выбирается из результата запроса /properties/timeformats\nholidays - нерабочие дни для компания\n    year - год, int от 2000 до 3000\n    days - массив нерабочих дней, в формате MM.dd\nforbidden_layers - Список запрещенных слоев, ключи получаются из справочника /properties с типом layers_type\nlogo - логотипе на экране мониторинга, на месте надписи Skif.Pro. Сначала нужно загрузить фото запросом:\n    `POST /api_v1/upload_photos/logos` , в form-data указать файл в поле file<br>\n     logo для компании выбрать из поля small.url\n\n\n ```\n\n---\n\n**Ответ:**\n\nВозвращает код 200 с body:\n\n```\n{\n    \"id\": \"75bd17cc-642f-4c7c-982e-e0e991907733\",\n    \"name\": \"Моя компания\",\n    \"auto_kill_sessions\": 20,\n    \"strong_password\": true,\n    \"timezone\": {\"key\": \"UTC+3\"}  // часовой пояс компании\n    \"dateformat\": {\"key\": \"yyyy-MM-dd\"},  // формат даты компании,\n    \"timeformat\": {\"key\": \"HH:mm:ss\"},  // формат времени компании,\n    \"holidays\": [\n         {\"year\": 2020, \"days\": [\"01.01\", \"01.02\", \"03.08\", \"04.13\", \"04.14\"]},\n         {\"year\": 2021, \"days\": [\"01.01\", \"01.02\", \"03.08\", \"04.15\", \"04.16\"]}\n    ],\n    \"forbidden_layers\": [\n        {\n            \"key\": \"pressure_new\",\n            \"type\": \"layers_type\",\n            \"value\": \"Давление\"\n        }\n    ],\n    \"action_templates\": [\n            {\n                \"name\": \"Шаблон1\",\n                \"is_unit_action\": false, относиться к объектам.\n                \"actions\": [\n                    {\"id\": \"e80c59b0-2c80-4bea-969c-498db4b0d446\"},\n                    {\"id\": \"62e20acf-cab3-4e8d-9e1f-e8774cf10764\"}\n                ]\n            },\n             {\n                \"name\": \"Шаблон2\",\n                \"is_unit_action\": true,\n                \"actions\": [\n                    {\"id\": \"7d0ca86a-66e2-473b-8f4c-a61cc3e40649\"},\n                    {\"id\": \"9259c55d-7e1c-45a2-ab3e-c98aef52a1f5\"}\n                ]\n            }\n        ]\n}\n\n ```\n\nВозвращает код 422 в случае если id не валидно, body :\n\n```\n{\n    \"code\": 4022,\n    \"field\": \"id\",\n    \"message\": \"Вы не имеете доступа к выбранной компании, попробуйте перезайти.\"\n}\n\n ```",
        "operationId": "companyId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "auto_kill_sessions": {
                    "type": "number",
                    "example": 0
                  },
                  "dateformat": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "d/MM/yy"
                      },
                      "type": {
                        "type": "string",
                        "example": "dateformats"
                      },
                      "value": {
                        "type": "string",
                        "example": "d/MM/yy(25/01/14, 2/12/87)"
                      }
                    }
                  },
                  "dealer": {
                    "type": "object",
                    "properties": {
                      "_default": {
                        "type": "boolean",
                        "example": false
                      },
                      "_delete": {
                        "type": "boolean",
                        "example": false
                      },
                      "contact_person": {
                        "type": "string",
                        "example": ""
                      },
                      "email": {
                        "type": "string",
                        "example": ""
                      },
                      "id": {
                        "type": "string",
                        "example": "dd11e469-f929-4087-96b2-3911335015c1"
                      },
                      "inn": {
                        "type": "string",
                        "example": ""
                      },
                      "is_default": {
                        "type": "boolean",
                        "example": false
                      },
                      "name": {
                        "type": "string",
                        "example": "Мониторинг Плюс Москва"
                      },
                      "phone": {
                        "type": "string",
                        "example": ""
                      },
                      "type": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "example": "legal_entity"
                          },
                          "type": {
                            "type": "string",
                            "example": "dealer_types"
                          },
                          "value": {
                            "type": "string",
                            "example": "Юридическое лицо"
                          }
                        }
                      }
                    }
                  },
                  "efis_retranslate": {
                    "type": "boolean",
                    "example": true
                  },
                  "forbidden_layers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "pressure_new"
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "pressure_new"
                      }
                    ]
                  },
                  "holidays": {
                    "type": "array",
                    "items": {},
                    "example": []
                  },
                  "id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "name": {
                    "type": "string",
                    "example": "Одуванчик "
                  },
                  "strong_password": {
                    "type": "boolean",
                    "example": false
                  },
                  "timeformat": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "HH:mm"
                      },
                      "type": {
                        "type": "string",
                        "example": "timeformats"
                      },
                      "value": {
                        "type": "string",
                        "example": "HH:mm(09:45, 17:20)"
                      }
                    }
                  },
                  "timezone": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "UTC+3"
                      },
                      "type": {
                        "type": "string",
                        "example": "timezones"
                      },
                      "value": {
                        "type": "string",
                        "example": "(GMT+03:00) Москва, Санкт-Петербург, Волгоград"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/company/:id": {
                  "value": {
                    "auto_kill_sessions": 0,
                    "dateformat": {
                      "key": "d/MM/yy",
                      "type": "dateformats",
                      "value": "d/MM/yy(25/01/14, 2/12/87)"
                    },
                    "dealer": {
                      "_default": false,
                      "_delete": false,
                      "contact_person": "",
                      "email": "",
                      "id": "dd11e469-f929-4087-96b2-3911335015c1",
                      "inn": "",
                      "is_default": false,
                      "name": "Мониторинг Плюс Москва",
                      "phone": "",
                      "type": {
                        "key": "legal_entity",
                        "type": "dealer_types",
                        "value": "Юридическое лицо"
                      }
                    },
                    "efis_retranslate": true,
                    "forbidden_layers": [
                      {
                        "key": "pressure_new"
                      }
                    ],
                    "holidays": [],
                    "id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "name": "Одуванчик ",
                    "strong_password": false,
                    "timeformat": {
                      "key": "HH:mm",
                      "type": "timeformats",
                      "value": "HH:mm(09:45, 17:20)"
                    },
                    "timezone": {
                      "key": "UTC+3",
                      "type": "timezones",
                      "value": "(GMT+03:00) Москва, Санкт-Петербург, Волгоград"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID доступной пользователю компании"
        }
      ]
    },
    "/api_v1/company/invite": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/invite",
        "description": "**Приглашение пользователя в систему**\n\n---\n\nМетод создает ссылку и отправляет ее на указанный email. По ссылке можно авторизоваться.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПараметры:\n\n```\nemail - email того, кого приглашаем\n{\n  \"email\": \"support@example.com\",\n  \"role\": {\"key\": \"Admin\", \"id\": \"fffaa80b-28a5-466b-a0a2-29761bfc8c80\"}, // Роль выбирается из списка ролей; достаточно указать только идентификатор. Получить все роли GET /roles,\n  \"companies\": [ //Можно указать ID конкретных компаний, это поле используется в админке\n        {\"id\": \"545c61a4-27ae-4335-a18e-e63e98b3eceb\"},\n        {\"id\": \"6b596675-81ba-4916-ac2d-32388da57e6d\"},\n        {\"id\": \"6c08dd40-950a-4d7e-86ee-aa8f12435ed7\"}\n   ]\n}\n\n ```\n\n---\n\n**Параметры ответа:**\n\nКод 200. Даже если пользователь с указанным паролем не существует. Ответ всегда такого вида\n\n```\n{\"code\":200,\"message\":\"На указанный email была выслана ссылка для восстановления.\"}\n\n ```",
        "operationId": "companyInvite",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "support@example.com"
                  },
                  "role": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "fffaa80b-28a5-466b-a0a2-29761bfc8c80"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/company/invite": {
                  "value": {
                    "email": "support@example.com",
                    "role": {
                      "id": "fffaa80b-28a5-466b-a0a2-29761bfc8c80"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/company/create": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/create",
        "description": "**Создание пользователем новой компании**\n\n---\n\n**Параметры:**\n\n```\n\"company_name\": текст, название компании, обязательное\n\"timezone\": часовой пояс компании, обязательное\n\"dateformat\": формат даты компании. Не обязательное. Если не указано, то установится дефолтный формат\n\"timeformat\": формат время компании. Не обязательное. Если не указано. то установится дефолтный формат\nlogo - логотипе на экране мониторинга, на месте надписи Skif.Pro. Сначала нужно загрузить фото запросом:\n    `POST /api_v1/upload_photos/logos` , в form-data указать файл в поле file\n     logo для компании выбрать из поля small.url\n\n\n ```\n\nПри создании вместе с первым пользователем требуются дополнительные поля:\n\n\"userProviderId\": \"[support@example.com](https://mailto:support@example.com)\", // email пользователя  \n\"type\": \"EMAIL\",  \n\"password\": \"your_secure_password\", // пароль  \n\"name\": \"Имя пользователя\",\n\nЕсли в запросе присутствует поле `userProviderId`, это означает, что компания создаётся вместе с пользователем.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"company_name\": \"A company X\",\n    \"timezone\": {\"key\": \"UTC+3\"},\n    \"imeis\": [\"3424324324\", \"657657657\"]\n}\n\n ```\n\n**Ответ:**\n\n```\n{\n    \"id\": \"8c78a9d2-0c10-48c2-9d25-746f243b39a8\",\n    \"name\": \"A company X\",\n    \"strong_password\": false,\n    \"efis_retranslate\": false,\n    \"integrator\": {\n        \"id\": \"fe371bd9-bba3-4c4a-b54b-b05fb77690c9\",\n        \"is_default\": false,\n        \"name\": \"Интегратор\",\n        \"inn\": \"\",\n        \"phone\": \"\",\n        \"email\": \"\",\n        \"contact_person\": \"\",\n        \"regions\": [\n            \"Казахстан\"\n        ],\n        \"_default\": false,\n        \"_delete\": false\n    },\n    \"timezone\": {\n        \"key\": \"UTC+3\",\n        \"type\": \"timezones\",\n        \"value\": \"(GMT + 03: 00) Moscow, St. Petersburg, Volgograd\"\n    },\n    \"dateformat\": {\n        \"key\": \"dd-MM-yyyy\",\n        \"type\": \"dateformats\",\n        \"value\": \"dd-MM-yyyy(25-01-2014, 02-12-1987)\"\n    },\n    \"timeformat\": {\n        \"key\": \"HH:mm:ss\",\n        \"type\": \"timeformats\",\n        \"value\": \"HH:mm:ss(09:45:33, 17:20:00)\"\n    },\n    \"holidays\": []\n}\n\n ```",
        "operationId": "companyCreate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_name": {
                    "type": "string",
                    "example": "A comapny Y"
                  },
                  "imeis": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "121212"
                    },
                    "example": [
                      "121212",
                      "131313"
                    ]
                  },
                  "timezone": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "UTC+3"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/company/create": {
                  "value": {
                    "company_name": "A comapny Y",
                    "imeis": [
                      "121212",
                      "131313"
                    ],
                    "timezone": {
                      "key": "UTC+3"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/company/sessions/query": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/sessions/query",
        "description": "**Получение сессий пользователей компании**\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nЗапрос данных ограничен периодом в один месяц.\n\n```\n{\n    \"from\":\"2024-10-01 00:00:00\",\n    \"from\":\"2024-11-01 00:00:00\", // необязательный параметр\n    \"first\":0, // необязательный параметр\n    \"count\":100 // необязательный параметр\n}\n\n ```",
        "operationId": "companySessionsQuery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "count": {
                    "type": "number",
                    "example": 100
                  },
                  "first": {
                    "type": "number",
                    "example": 0
                  },
                  "from": {
                    "type": "string",
                    "example": "2024-01-01 00:00:00"
                  },
                  "to": {
                    "type": "string",
                    "example": "2024-01-12 00:00:00"
                  }
                }
              },
              "examples": {
                "/company/sessions/query": {
                  "value": {
                    "count": 100,
                    "first": 0,
                    "from": "2024-01-01 00:00:00",
                    "to": "2024-01-12 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/company/{id}/sessions/query": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/sessions/query",
        "description": "**Получение сессий пользователей компании из админ панели**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\nПараметры запроса:\n\nid - ID компании\n\n```\n{\n    \"from\":\"2020-10-01 00:00:00\",\n    \"first\":0,\n    \"count\":100\n}\n\n ```\n\nЗапрос данных ограничен периодом в один месяц",
        "operationId": "companyIdSessionsQuery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "count": {
                    "type": "number",
                    "example": 100
                  },
                  "first": {
                    "type": "number",
                    "example": 0
                  },
                  "from": {
                    "type": "string",
                    "example": "2020-10-01 00:00:00"
                  }
                }
              },
              "examples": {
                "/company/:id/sessions/query": {
                  "value": {
                    "count": 100,
                    "first": 0,
                    "from": "2020-10-01 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/company/updates/query": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/updates/query",
        "description": "**Получение истории изменения сущностей**\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПример запроса для одной сущности:\n\n```\n{\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-10-01 00:00:00\",\n    \"object_id\": \"b56f98e9-7c8e-4cda-a642-6d4e207de5d4\",\n    \"first_row\": 0,\n    \"max_rows\": 100,\n    \"sortField\": \"created\",\n    \"sortDesc\": true\n}\n\n ```\n\nПример запроса для всего справочника units:\n\n```\n{\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-10-01 00:00:00\",\n    \"objects\": \"units\",\n    \"first_row\": 0,\n    \"max_rows\": 100,\n    \"sortField\": \"created\",\n    \"sortDesc\": true,\n    \"value\": \"user1\"\n}\n\n ```\n\nЗапрос данных ограничен периодом в один год\n\n**Возможные параметры:**\n\nmax_rows - максимальное количестов строк.\n\nfrom - дата-время от какой выдавать данные, необязательный параметр. По умолчанию - текущее время минус 7 дней.\n\nto - дата-время до какой выдавать данные, необязательный параметр. По умолчанию - текущее время.\n\nfirst_row - первая строка, необязательный параметр. По умолчанию 0.\n\nmax_rows - максимальное количество строк в выдаче, необязательный параметр. По умолчанию 10000.\n\nobject_id - если нужно запросить изменение по конкретной сущности, используйте id нужной сущности, необязательный параметр.\n\nobjects - по каким типам сущностей возвращать историю - users, units, company, unitsgroup, units_trailers, geozones, report_templates, notifications, routes, trips, trailers, mailings.\n\nsortField - имя поля для сортировки результатов, возможные значения: created, user.name, operation.\n\nsortDesc - true, если надо соортировать по убыванию.\n\nvalue - искомый текст.\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"list\": [{\n        \"created\": \"2020-11-11 15:55:33\",\n        \"user\": {\n            \"id\": \"5551b5bd-b4d7-4f99-a166-c9ecdabccee0\",\n            \"name\": \"user1\",\n            \"email\": \"support@example.com\"\n        },\n        \"objects\": \"company\",\n        \"operation\": \"PUT\",\n        \"object_id\": \"11e541f5-3b57-4968-a428-eb13dde6ede0\",\n        \"msg\": \"Пользователь user1 обновил настройки компании\"\n    }],\n    \"max_rows\": 1\n}\n\n ```\n\ncreated - дата время\n\nobjects - тип сущностей\n\nuser - автор изменений\n\noperation - операция PUT, DELETE, POST - изменение, удаление, создание\n\nobject_id - id объекта\n\nmsg - текст",
        "operationId": "companyUpdatesQuery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "first_row": {
                    "type": "number",
                    "example": 0
                  },
                  "from": {
                    "type": "string",
                    "example": "2021-01-05 00:00:00"
                  },
                  "max_rows": {
                    "type": "number",
                    "example": 100
                  },
                  "objects": {
                    "type": "string",
                    "example": "units"
                  },
                  "sortDesc": {
                    "type": "boolean",
                    "example": true
                  },
                  "sortField": {
                    "type": "string",
                    "example": "user.name"
                  },
                  "to": {
                    "type": "string",
                    "example": "2021-12-12 23:59:59"
                  }
                }
              },
              "examples": {
                "/company/updates/query": {
                  "value": {
                    "first_row": 0,
                    "from": "2021-01-05 00:00:00",
                    "max_rows": 100,
                    "objects": "units",
                    "sortDesc": true,
                    "sortField": "user.name",
                    "to": "2021-12-12 23:59:59"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/company/schedule_delete": {
      "delete": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/schedule_delete",
        "description": "**Удаление компании**\n\n---\n\n**Параметры:**\n\nids - ID удалаемых компаний.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"ids\": [\"acce8268-e0ef-4fda-a6ea-89ed23ffae50\"]\n}\n\n ```\n\nПока можно удалить только одну компанию в одном запросе.\n\n---\n\nЕсли все ok, тогда запланируетсяудаление. Его можно отменить с помощью роут POST /company/cancel_delete",
        "operationId": "companyScheduleDelete",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "04350fc5-8cec-4edc-bed1-7e1ee9a9e630"
                    },
                    "example": [
                      "04350fc5-8cec-4edc-bed1-7e1ee9a9e630"
                    ]
                  }
                }
              },
              "examples": {
                "/company/schedule_delete": {
                  "value": {
                    "ids": [
                      "04350fc5-8cec-4edc-bed1-7e1ee9a9e630"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/company/cancel_delete": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/cancel_delete",
        "description": "**Отмена удаления компании**\n\n---\n\n**Параметры:**\n\nids - ID удаляемых компаний.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"ids\": [\"acce8268-e0ef-4fda-a6ea-89ed23ffae50\"]\n}\n\n ```\n\n---\n\nЕсли все ok, тогда удаление отменяется.",
        "operationId": "companyCancelDelete",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "04350fc5-8cec-4edc-bed1-7e1ee9a9e630"
                    },
                    "example": [
                      "04350fc5-8cec-4edc-bed1-7e1ee9a9e630"
                    ]
                  }
                }
              },
              "examples": {
                "/company/cancel_delete": {
                  "value": {
                    "ids": [
                      "04350fc5-8cec-4edc-bed1-7e1ee9a9e630"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/company/{id}/roles": {
      "get": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/roles",
        "description": "**Получение доступных ролей для компании**\n\n---\n\nid - ID компании\n\nВозвращается массив ролей\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nGET [https://api.skif.pro/api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/roles](https://api.skif.pro/api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/roles)\n\n**Пример ответа:**\n\n``` json\n[\n    {\n        \"key\": \"NO_ACCESS\",\n        \"value\": \"Без доступа\"\n    },\n    {\n        \"key\": \"OBSERVER\",\n        \"value\": \"Наблюдатель\"\n    },\n    {\n        \"key\": \"READER\",\n        \"value\": \"Читатель\"\n    },\n    {\n        \"key\": \"OPERATOR\",\n        \"value\": \"Оператор\"\n    },\n    {\n        \"key\": \"EDITOR\",\n        \"value\": \"Редактор\"\n    },\n    {\n        \"key\": \"ADMIN\",\n        \"value\": \"Администратор\"\n    },\n    {\n        \"key\": \"SUPERVISOR\",\n        \"value\": \"Супервизор\"\n    },\n    {\n        \"key\": \"TARIFF_EDITOR\",\n        \"value\": \"Редактор тарифа\"\n    },\n    {\n        \"key\": \"CONTROLLER\",\n        \"value\": \"Контроллер\"\n    }\n]\n\n ```",
        "operationId": "companyIdRoles",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/company/{id}/addable_users": {
      "get": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/addable_users?search=:search",
        "description": "**Получение списка пользователей, доступных для добавления в компанию**\n\n---\n\n**Параметры:**\n\nid - ID компании.\n\nsearch - текст для поиска.\n\noffset - индекс первого элемента в странице.\n\ncount - количество в странице.\n\nВозвращается массив пользователей с полями id, name и email.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nGET /api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/addable_users?search=test1\n\n**Пример ответа:**\n\nmax - общее количество\n\nlist - список пользователей\n\n``` json\n{\n    \"max\": 4,\n    \"list\": [\n        {\n            \"id\": \"5e139290-cfbc-4770-b42a-fdf12d898684\",\n            \"name\": \"123123\",\n            \"email\": \"test16@test.kmm\"\n        },\n        {\n            \"id\": \"0010b3d2-dc83-4ea3-a3ab-2cf04a79ceeb\",\n            \"name\": \"test1@test.rm\",\n            \"email\": \"test1@test.rm\"\n        }\n    ]\n}\n\n ```",
        "operationId": "companyIdAddableUsersSearchSearch",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            },
            "description": "текст для поиска"
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            },
            "description": "индекс первого элемента в странице"
          },
          {
            "name": "count",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            },
            "description": "количество в странице"
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/company/{id}/add_users": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/add_users",
        "description": "**Добавление существующих доступных пользователей в компанию**\n\n---\n\nid - ID компании\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nPOST /api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/add_users\n\n**Пример тела запроса:**\n\n``` json\n{\n    \"users\": [\n        {\n            \"id\": \"8d33f780-3923-463f-ab5c-500edca4219a\"\n        },\n        {\n            \"id\": \"edbb2a66-4847-4a80-a3c4-f76907ac31d5\"\n        }\n    ],\n    \"role\": {\n        \"key\": \"ADMIN\",\n        \"value\": \"Администратор\"\n    }\n}\n\n ```\n\nВозврвщается ответ со статусом 200 или ошибка",
        "operationId": "companyIdAddUsers",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "role": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "ADMIN"
                      },
                      "value": {
                        "type": "string",
                        "example": "Администратор"
                      }
                    }
                  },
                  "users": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "8d33f780-3923-463f-ab5c-500edca4219a"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "8d33f780-3923-463f-ab5c-500edca4219a"
                      },
                      {
                        "id": "edbb2a66-4847-4a80-a3c4-f76907ac31d5"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/company/:id/add_users": {
                  "value": {
                    "role": {
                      "key": "ADMIN",
                      "value": "Администратор"
                    },
                    "users": [
                      {
                        "id": "8d33f780-3923-463f-ab5c-500edca4219a"
                      },
                      {
                        "id": "edbb2a66-4847-4a80-a3c4-f76907ac31d5"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/company/{id}/users": {
      "get": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/users?ids=",
        "description": "**Добавление существующих доступных пользователей в компанию**\n\n---\n\nid - ID компании\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nPOST /api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/add_users\n\n**Пример тела запроса:**\n\n``` json\n{\n    \"users\": [\n        {\n            \"id\": \"8d33f780-3923-463f-ab5c-500edca4219a\"\n        },\n        {\n            \"id\": \"edbb2a66-4847-4a80-a3c4-f76907ac31d5\"\n        }\n    ],\n    \"role\": {\n        \"key\": \"ADMIN\",\n        \"value\": \"Администратор\"\n    }\n}\n\n ```\n\nВозврвщается ответ со статусом 200 или ошибка",
        "operationId": "companyIdUsersIds",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            },
            "description": "ID пользователя"
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/company/{id}/properties": {
      "get": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/properties",
        "description": "**Получение настройки для компании**\n\n---\n\nGET /api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/properties\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nВозвращается ответ со статусом 200\n\n```\ntrack_gradation - цветовая градация трека\nstyles - массив стилей\nmax - максимальное значение скоорости\nhex_color - шестнадцатеричный Код Цвета\nmonitoring_sensors_settings - настройка датчики для мониторинга\nname - название, строка\nsensor_name_mask - маска датчика, строка\nicon - ключ для иконки, строка\ngradation - цветовая градация, такая же структура как в track_gradation\n\n ```\n\n**Пример ответа:**\n\n``` json\n{\n    \"track_gradation\": {\n        \"styles\": [\n            {\n                \"max\": 40,\n                \"hex_color\": \"#51AAEB\"\n            },\n            {\n                \"max\": 80,\n                \"hex_color\": \"#623F73\"\n            },\n            {\n                \"max\": 120,\n                \"hex_color\": \"#E37A3A\"\n            },\n            {\n                \"max\": null,\n                \"hex_color\": \"#DD1E1E\"\n            }\n        ]\n    },\n    \"monitoring_sensors_settings\": [\n        {\n            \"name\": \" Уровень топлива\",\n            \"sensor_name_mask\": \"*топлива*\",\n            \"icon\": \"icon_fuel_level\",\n            \"gradation\": {\n                \"styles\": [\n                    {\n                        \"max\": 42,\n                        \"hex_color\": \"#51AAEB\"\n                    },\n                    {\n                        \"max\": 80,\n                        \"hex_color\": \"#623F73\"\n                    },\n                    {\n                        \"max\": 120,\n                        \"hex_color\": \"#E37A3A\"\n                    },\n                    {\n                        \"max\": null,\n                        \"hex_color\": \"#DD1E1E\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Зажигания\",\n            \"sensor_name_mask\": \"*зажиган*\",\n            \"icon\": \"icon_ignition\",\n            \"gradation\": {\n                \"styles\": [\n                    {\n                        \"max\": 0,\n                        \"hex_color\": \"#E37A3A\"\n                    },\n                    {\n                        \"max\": null,\n                        \"hex_color\": \"#DD1E1E\"\n                    }\n                ]\n            }\n        }\n    ]\n}\n\n ```",
        "operationId": "companyIdProperties",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/properties",
        "description": "**Обновление настроек компании**\n\n---\n\nПараметр запроса:\n\nid - ID компании\n\nТело запроса JSON:\n\n```\ntrack_gradation - цветовая градация трека\nstyles - массив стилей\nmax - максимальное значение скоорости\nhex_color - шестнадцатеричный Код Цвета\nmonitoring_sensors_settings - настройка датчиков для мониторинга\nname - название, строка\nsensor_name_mask - маска датчика, строка\nicon - ключ для иконки, строка\ngradation - цветовая градация, такая же структура, как в track_gradation\n\n ```\n\n1. **Пример запроса на обновление цвета трека:**\n\n\nPUT /api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/properties\n\n``` json\n{\n    \"track_gradation\": {\n        \"styles\": [\n            {\n                \"max\": 41,\n                \"hex_color\": \"#51AAEB\"\n            },\n            {\n                \"max\": 80,\n                \"hex_color\": \"#623F73\"\n            },\n            {\n                \"max\": 120,\n                \"hex_color\": \"#E37A3A\"\n            },\n            {\n                \"max\": null,\n                \"hex_color\": \"#DD1E1E\"\n            }\n        ]\n    }\n}\n\n ```\n\nВозвращается ответ со статусом 200 или ошибка\n\n```\ntrack_gradation - Цветовая градация трека\n    styles - массив стилей\n        max - максимальное значение скорости\n        hex_color - Шестнадцатеричный Код Цвета\n\n ```\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПример тела ответа:\n\n``` json\n{\n    \"track_gradation\": {\n        \"styles\": [\n            {\n                \"max\": 41,\n                \"hex_color\": \"#51AAEB\"\n            },\n            {\n                \"max\": 80,\n                \"hex_color\": \"#623F73\"\n            },\n            {\n                \"max\": 120,\n                \"hex_color\": \"#E37A3A\"\n            },\n            {\n                \"max\": null,\n                \"hex_color\": \"#DD1E1E\"\n            }\n        ]\n    }\n}\n\n ```\n\n**2\\. Пример запроса на обновление настройки датчиков для мониторинга**\n\n``` json\n{\n    \"monitoring_sensors_settings\": [\n        {\n            \"name\": \" Уровень топлива\",\n            \"sensor_name_mask\": \"*топлива*\",\n            \"icon\": \"icon_fuel_level\",\n            \"gradation\": {\n                \"styles\": [\n                    {\n                        \"max\": 42,\n                        \"hex_color\": \"#51AAEB\"\n                    },\n                    {\n                        \"max\": 80,\n                        \"hex_color\": \"#623F73\"\n                    },\n                    {\n                        \"max\": 120,\n                        \"hex_color\": \"#E37A3A\"\n                    },\n                    {\n                        \"max\": null,\n                        \"hex_color\": \"#DD1E1E\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Зажигания\",\n            \"sensor_name_mask\": \"*зажиган*\",\n            \"icon\": \"icon_ignition\",\n            \"gradation\": {\n                \"styles\": [\n                    {\n                        \"max\": 0,\n                        \"hex_color\": \"#E37A3A\"\n                    },\n                    {\n                        \"max\": null,\n                        \"hex_color\": \"#DD1E1E\"\n                    }\n                ]\n            }\n        }\n    ]\n}\n\n ```",
        "operationId": "companyIdProperties1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "track_gradation": {
                    "type": "object",
                    "properties": {
                      "styles": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "hex_color": {
                              "type": "string",
                              "example": "#51AAEB"
                            },
                            "max": {
                              "type": "number",
                              "nullable": true,
                              "example": 41
                            }
                          }
                        },
                        "example": [
                          {
                            "hex_color": "#51AAEB",
                            "max": 41
                          },
                          {
                            "hex_color": "#623F73",
                            "max": 80
                          },
                          {
                            "hex_color": "#E37A3A",
                            "max": 120
                          },
                          {
                            "hex_color": "#DD1E1E",
                            "max": null
                          }
                        ]
                      }
                    }
                  }
                }
              },
              "examples": {
                "/company/:id/properties": {
                  "value": {
                    "track_gradation": {
                      "styles": [
                        {
                          "hex_color": "#51AAEB",
                          "max": 41
                        },
                        {
                          "hex_color": "#623F73",
                          "max": 80
                        },
                        {
                          "hex_color": "#E37A3A",
                          "max": 120
                        },
                        {
                          "hex_color": "#DD1E1E",
                          "max": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/company/{id}/properties/copy": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/properties/copy",
        "description": "**Обновление настроек компании**\n\n---\n\nПараметр запроса:\n\nid - ID компании, из которой необходимо скопировать свойства\n\nТело запроса JSON:\n\n**companies** - список компаний, на которые копируются свойств, см. пример  \n**properties** - список свойств, которые копируются  \nвозможные значения:\n\navailable_maps - Доступные карты  \ntrack_gradation - Цвет трека  \nmonitoring_sensors_settings - Цветные индикаторы датчиков в мониторинге\n\n1. **Пример запроса на обновление цвета трека:**\n\n\nPUT /api_v1/company/3e70f167-9fad-4753-bccf-d7d47c2c648c/properties/copy\n\n``` json\n{\n    \"companies\": [\n        {\"id\": \"42ee050a-f6f7-40c0-a8d8-1656e787dc0b\"},\n        {\"id\": \"c968398b-be00-4b4a-9e2c-7d7bdc0d43ad\"}\n    ],\n    \"properties\": [\n        \"available_maps\",\n        \"monitoring_sensors_settings\",\n        \"track_gradation\"\n    ]\n}\n\n ```\n\nВозвращается ответ со статусом 200 или ошибка\n\n**Роль:** Администратор и выше.\n\n---",
        "operationId": "companyIdPropertiesCopy",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "42ee050a-f6f7-40c0-a8d8-1656e787dc0b"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "42ee050a-f6f7-40c0-a8d8-1656e787dc0b"
                      },
                      {
                        "id": "c968398b-be00-4b4a-9e2c-7d7bdc0d43ad"
                      }
                    ]
                  },
                  "properties": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "available_maps"
                    },
                    "example": [
                      "available_maps",
                      "monitoring_sensors_settings",
                      "track_gradation"
                    ]
                  }
                }
              },
              "examples": {
                "/company/:id/properties/copy": {
                  "value": {
                    "companies": [
                      {
                        "id": "42ee050a-f6f7-40c0-a8d8-1656e787dc0b"
                      },
                      {
                        "id": "c968398b-be00-4b4a-9e2c-7d7bdc0d43ad"
                      }
                    ],
                    "properties": [
                      "available_maps",
                      "monitoring_sensors_settings",
                      "track_gradation"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID целевой компании для копирования настроек",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/geozones/custom_types": {
      "post": {
        "tags": [
          "Геозоны",
          "Пользовательский тип геозоны"
        ],
        "summary": "geozones/custom_types",
        "description": "geozones/custom_types",
        "operationId": "geozonesCustomTypes",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "11111111-1111-1111-1111-111111111111"
                  },
                  "name": {
                    "type": "string",
                    "example": "test"
                  },
                  "photo": {
                    "type": "object",
                    "properties": {
                      "original": {
                        "type": "object",
                        "properties": {
                          "height": {
                            "type": "number",
                            "example": 3456
                          },
                          "param_type": {
                            "type": "string",
                            "example": "geozones"
                          },
                          "url": {
                            "type": "string",
                            "example": "/photos/geozones/0559a281-5f03-4f36-8871-2a18daa16f56_original.jpeg"
                          },
                          "width": {
                            "type": "number",
                            "example": 5184
                          }
                        }
                      },
                      "small": {
                        "type": "object",
                        "properties": {
                          "height": {
                            "type": "number",
                            "example": 200
                          },
                          "param_type": {
                            "type": "string",
                            "example": "geozones"
                          },
                          "url": {
                            "type": "string",
                            "example": "/photos/geozones/0559a281-5f03-4f36-8871-2a18daa16f56_300.jpeg"
                          },
                          "width": {
                            "type": "number",
                            "example": 300
                          }
                        }
                      }
                    }
                  }
                }
              },
              "examples": {
                "geozones/custom_types": {
                  "value": {
                    "company_id": "11111111-1111-1111-1111-111111111111",
                    "name": "test",
                    "photo": {
                      "original": {
                        "height": 3456,
                        "param_type": "geozones",
                        "url": "/photos/geozones/0559a281-5f03-4f36-8871-2a18daa16f56_original.jpeg",
                        "width": 5184
                      },
                      "small": {
                        "height": 200,
                        "param_type": "geozones",
                        "url": "/photos/geozones/0559a281-5f03-4f36-8871-2a18daa16f56_300.jpeg",
                        "width": 300
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/geozones": {
      "get": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/goezones?ids=<ids1,ids2>",
        "description": "**Получение геозон**\n\n---\n\nВозвращает массив всех геозон.\n\n---\n\n**Ответ:**\n\nЕсли запрашивается по одному id - вернется не массив, а один объект.\n\nЕсли запрашивать по конкретному id - вернётся даже удаленная геозона.\n\nЕсли запрос без id (просто GET /geozones), то удаленные геозоны не отобразятся.\n\n```\n\"{\n    \"id\":\"a321b5f0-f52c-4d36-9d39-f11ba64f9293\",\n    \"name\":\"POI\",\n    \"type\":{\"key\":\"point\",\"type\":\"geozone_type\",\"value\":\"Точка\"},\n    \"geometry\":[[33.1,55.2]],\n    \"color\":{\"key\":\"#E68A2F\",\"type\":\"color_code\",\"value\":\"Оранжевый\"},\n    \"width\":1777.0,\n    \"icon\":{\"key\":\"hospital\",\"type\":\"geo_icon\",\"value\":\"Больница\"},\n    \"is_show_on_map\": true,\n    \"area\": 2032932.5,\n    \"perimeter\": 2234.3\n}\"\n\n ```",
        "operationId": "goezonesIdsIds1Ids2",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones",
        "description": "**Создание геозоны**\n\n---\n\nДобавляет новую геозону, присваивая id.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Параметры:**\n\n```\n{\n  \"companies\": [{\"id\": \"e94111ca-b6a7-4b7e-a844-fcbc9043ac8f\"}] //список компаний\n  \"name\": \"POI\", //название\n  \"type\": {\"key\": \"point\"}, // тип геозоны, key = [point, circle, line, polygon] (можно добавлять \"type\":\"geozone_type\").\n  \"icon\": {\"key\": \"hospital\"}, // тип иконки, key = [hospital, school] (можно добавлять \"type\":\"geo_icon\").\n  \"geometry\": [ //геометрия - всегда массив координат\n    [\n      33.1,\n      55.2\n    ]\n  ],\n  \"is_show_on_map\": true,\n  \"color\": {\"key\": \"#E6EAEE\"}, //цвет, key = ['#F56C6C', '#E6EAEE', '#E68A2F', '#1585D8', '#1BB934'], (можно добавлять \"type\": \"color_code\").\n  \"width\": 1777, //ширина\n  \"area\": 2032932.5 // площадь в m2,\n  \"perimeter\": 2234.3 // периметр в m,\n  \"polygon_geometry\": [[55, 33], [56, 32]] //координаты после преобразование в полигон(только для линии)\n}\n\n ```\n\n**Ответ:**\n\nВозвращает созданную запись и ее id. Пустые поля не возвращаются.",
        "operationId": "geozones",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "color": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "#E68A2F"
                      }
                    }
                  },
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                      },
                      {
                        "id": "42ee050a-f6f7-40c0-a8d8-1656e787dc0b"
                      }
                    ]
                  },
                  "geometry": {
                    "type": "array",
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "number",
                        "example": 33.1
                      },
                      "example": [
                        33.1,
                        55.2
                      ]
                    },
                    "example": [
                      [
                        33.1,
                        55.2
                      ]
                    ]
                  },
                  "icon": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "hospital"
                      }
                    }
                  },
                  "name": {
                    "type": "string",
                    "example": "POI_Z"
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "circle"
                      }
                    }
                  },
                  "width": {
                    "type": "number",
                    "example": 20777
                  }
                }
              },
              "examples": {
                "/geozones": {
                  "value": {
                    "color": {
                      "key": "#E68A2F"
                    },
                    "companies": [
                      {
                        "id": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                      },
                      {
                        "id": "42ee050a-f6f7-40c0-a8d8-1656e787dc0b"
                      }
                    ],
                    "geometry": [
                      [
                        33.1,
                        55.2
                      ]
                    ],
                    "icon": {
                      "key": "hospital"
                    },
                    "name": "POI_Z",
                    "type": {
                      "key": "circle"
                    },
                    "width": 20777
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones?ids=:ids",
        "description": "**Планирование удаления геозоны**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "geozonesIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/geozones": {
                  "value": ""
                },
                "/geozones?ids=:ids": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/geozones_on_map": {
      "get": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/goezones_on_map",
        "description": "**Получение геозон для отображения на карте в виде geojson**\n\n---\n\nВозвращает массив всех геозон, которые нужно отображать на карте.\n\n---\n\n**Ответ:**\n\n```\n{\n  \"type\":\"FeatureCollection\",\n  \"features\":[\n     {\n        \"type\":\"Feature\",\n        \"id\":\"a9e42e60-bdce-48ed-946c-55d141ce58b4\",\n        \"geometry\":{\n           \"type\":\"Point\",\n           \"coordinates\":[\n              55.0,\n              30.0\n           ]\n        },\n        \"properties\":{\n           \"address\":\"\",\n           \"name\":\"POI-1\"\n        }\n     },\n     {\n        \"type\":\"Feature\",\n        \"id\":\"83592eea-20ff-4db0-9ca7-1aa3450c6453\",\n        \"geometry\":{\n           \"type\":\"Point\",\n           \"coordinates\":[\n              55.0,\n              55.0\n           ]\n        },\n        \"properties\":{\n           \"address\":\"\",\n           \"name\":\"POI-2\"\n        }\n     },\n     {\n        \"type\":\"Feature\",\n        \"id\":\"3def4148-335f-42d1-aca4-d55366f93ee8\",\n        \"geometry\":{\n           \"type\":\"Point\",\n           \"coordinates\":[\n              55.0,\n              30.0\n           ]\n        },\n        \"properties\":{\n           \"address\":\"\",\n           \"name\":\"POI-3\"\n        }\n     },\n     {\n        \"type\":\"Feature\",\n        \"id\":\"4c061c44-2112-4494-a015-63d5bdb70194\",\n        \"geometry\":{\n           \"type\":\"Point\",\n           \"coordinates\":[\n              30.0,\n              30.0\n           ]\n        },\n        \"properties\":{\n           \"address\":\"\",\n           \"name\":\"POI-4\"\n        }\n     }\n  ]\n}\n\n ```",
        "operationId": "goezonesOnMap",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/geozones/{id}": {
      "put": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/:id",
        "description": "**Обновление данных геозоны**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Параметры:**\n\nСм метод POST /geozones\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /geozeons",
        "operationId": "geozonesId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "color": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "#E68A2F"
                      },
                      "type": {
                        "type": "string",
                        "example": "color_code"
                      },
                      "value": {
                        "type": "string",
                        "example": "Оранжевый"
                      }
                    }
                  },
                  "geometry": {
                    "type": "array",
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "number",
                        "example": 33.1
                      },
                      "example": [
                        33.1,
                        55.2
                      ]
                    },
                    "example": [
                      [
                        33.1,
                        55.2
                      ]
                    ]
                  },
                  "icon": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "hospital"
                      },
                      "type": {
                        "type": "string",
                        "example": "geo_icon"
                      },
                      "value": {
                        "type": "string",
                        "example": "Больница"
                      }
                    }
                  },
                  "id": {
                    "type": "string",
                    "example": "31bb27f2-c937-4a91-8a95-e65515957411"
                  },
                  "name": {
                    "type": "string",
                    "example": "POI"
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "point"
                      },
                      "type": {
                        "type": "string",
                        "example": "geozone_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Точка 2"
                      }
                    }
                  },
                  "width": {
                    "type": "number",
                    "example": 1777
                  }
                }
              },
              "examples": {
                "/geozones/:id": {
                  "value": {
                    "color": {
                      "key": "#E68A2F",
                      "type": "color_code",
                      "value": "Оранжевый"
                    },
                    "geometry": [
                      [
                        33.1,
                        55.2
                      ]
                    ],
                    "icon": {
                      "key": "hospital",
                      "type": "geo_icon",
                      "value": "Больница"
                    },
                    "id": "31bb27f2-c937-4a91-8a95-e65515957411",
                    "name": "POI",
                    "type": {
                      "key": "point",
                      "type": "geozone_type",
                      "value": "Точка 2"
                    },
                    "width": 1777
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор геозоны (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/:id",
        "description": "**Удаление геозоны по ее id**\n\n---\n\n**Параметры:**\n\nid геозоны\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\n200 и удаленная геозона\n\nЕсли геозона с таким id не найдена, то возвращается ошибка 400\n\n```\n{\n    \"code\": 4000,\n    \"field\": \"id\",\n    \"message\": \"Недопустимый параметр\"\n}\n\n ```",
        "operationId": "geozonesId",
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/geozones/:id": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор геозоны (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID геозоны"
        }
      ]
    },
    "/api_v1/geozones/{id}/all": {
      "delete": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/:id/all",
        "description": "**Удаление геозоны по ее id во всех компаниях в админке**\n\n---\n\n**Параметры:**\n\nid геозоны\n\n---\n\n**Ответ:**\n\n200 и удаленная геозона.\n\nЕсли геозона с таким id не найдена, то возвращается ошибка 400.\n\n```\n{\n\"code\": 4000,\n\"field\": \"id\",\n\"message\": \"Недопустимый параметр\"\n}\n\n ```",
        "operationId": "geozonesIdAll",
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/geozones/:id/all": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор геозоны (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID геозоны"
        }
      ]
    },
    "/api_v1/geozones/list": {
      "post": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/list",
        "description": "**Получение геозоны по фильтру**\n\n---\n\nАналогична запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[name, created, is_delete, icon.key, color.key, type.key\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - name (можно искать по неполному слову), icon.key, icon.type, color.key, color.type, type.key, type.type\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 геозон, отсортированные по возрастанию по имени, которые имеют тип \"point\" и иконку \"school\"\n\n```\n{\n                        \"from\":0,\n                        \"count\":10,\n                        \"sortField\":\"name\",\n                        \"sortDesc\":\"false\",                        \"conditions\":[\n                            { \"field\": \"type.key\", \"value\": \"point\"},\n                            { \"field\": \"icon.key\", \"value\": \"school\"}\n                        ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\":1,\n    \"list\":\n    [\n        {\"id\":\"80773471-1eb8-4b71-ad44-fcfd6d8c721a\",\n         \"name\":\"aPOI-2\",\n         \"type\":{\"key\":\"point\",\n                 \"type\":\"geozone_type\",\n                 \"value\":\"Точка\"},\n         \"geometry\":[[55.3,33.2]],\n         \"color\":{\"key\":\"#E6EAEE\",\n                  \"type\":\"color_code\",\n                  \"value\":\"translate.color_code.key.grey\"},\n         \"width\":1900.0,\n         \"area\": 2032932.5,\n            \"perimeter\": 2234.3,\n         \"icon\":{\"key\":\"hospital\",\n                 \"type\":\"geo_icon\",\n                 \"value\":\"Больница\"}\n         },\n    ]\n}\n\n ```",
        "operationId": "geozonesList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "type.key"
                        },
                        "value": {
                          "type": "string",
                          "example": "point"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "type.key",
                        "value": "point"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 1
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "sortDesc": {
                    "type": "string",
                    "example": "false"
                  },
                  "sortField": {
                    "type": "string",
                    "example": "name"
                  }
                }
              },
              "examples": {
                "/geozones/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "type.key",
                        "value": "point"
                      }
                    ],
                    "count": 1,
                    "from": 0,
                    "sortDesc": "false",
                    "sortField": "name"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/geozones/line2polygon": {
      "post": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/line2polygon",
        "description": "**Генерация координат для линии**\n\n---\n\n**Параметры:**\n\nwidth - ширина\n\ngeometry - координаты линии\n\nВ ответ возвращаются координаты полигона в поле polygon_geometry\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"width\": 10,\n    \"geometry\": [\n        [\n            54.6977009532508,\n            37.35351562500001\n        ],\n        [\n            54.53663764197375,\n            37.40158081054688\n        ],\n        [\n            54.61405984802798,\n            37.69821166992188\n        ],\n        [\n            54.67780208930051,\n            37.54714965820313\n        ],\n        [\n            54.762105979366964,\n            37.62954711914063\n        ],\n        [\n            54.69372196444214,\n            37.69683837890626\n        ]\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"polygon_geometry\": [\n        [\n            54.69771417625393,\n            37.35355993442366\n        ],\n        [\n            54.536726211105375,\n            37.401630671355655\n        ],\n        [\n            54.614075095960615,\n            37.698000235820835\n        ],\n        [\n            54.67778288639096,\n            37.54705432526793\n        ],\n        [\n            54.76218431453469,\n            37.62954698668847\n        ],\n        [\n            54.693760434922694,\n            37.69687747411603\n        ],\n        [\n            54.693683493961586,\n            37.696799283696485\n        ],\n        [\n            54.762027644199236,\n            37.6295472515928\n        ],\n        [\n            54.67782129221007,\n            37.547244991138335\n        ],\n        [\n            54.61404460009534,\n            37.69842310402293\n        ],\n        [\n            54.53654907284212,\n            37.40153094973811\n        ],\n        [\n            54.69768773024767,\n            37.35347131557636\n        ]\n    ]\n}\n\n ```",
        "operationId": "geozonesLine2polygon",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "geometry": {
                    "type": "array",
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "number",
                        "example": 54.6977009532508
                      },
                      "example": [
                        54.6977009532508,
                        37.35351562500001
                      ]
                    },
                    "example": [
                      [
                        54.6977009532508,
                        37.35351562500001
                      ],
                      [
                        54.53663764197375,
                        37.40158081054688
                      ],
                      [
                        54.61405984802798,
                        37.69821166992188
                      ],
                      [
                        54.67780208930051,
                        37.54714965820313
                      ],
                      [
                        54.76210597936696,
                        37.62954711914063
                      ],
                      [
                        54.69372196444214,
                        37.69683837890626
                      ]
                    ]
                  },
                  "width": {
                    "type": "number",
                    "example": 10
                  }
                }
              },
              "examples": {
                "/geozones/line2polygon": {
                  "value": {
                    "geometry": [
                      [
                        54.6977009532508,
                        37.35351562500001
                      ],
                      [
                        54.53663764197375,
                        37.40158081054688
                      ],
                      [
                        54.61405984802798,
                        37.69821166992188
                      ],
                      [
                        54.67780208930051,
                        37.54714965820313
                      ],
                      [
                        54.76210597936696,
                        37.62954711914063
                      ],
                      [
                        54.69372196444214,
                        37.69683837890626
                      ]
                    ],
                    "width": 10
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "20 req/min"
      }
    },
    "/api_v1/geozones/export_kml": {
      "post": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/export_kml",
        "description": "# Экспорт геозон в .kml\n\n---\n\nВ теле запроса укажите требуемые геозоны в geozones. Если geozones не указаны, то запрос формируется для всех геозон компании. Для группы геозон geozones_groups\n\n---\n\n**Роль:** Читател и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"geozones\": [\n        {\"id\": \"0ca9f774-69fb-4a56-99ae-177f766fc291\"},\n        {\"id\": \"8b13e5d3-898a-4463-8f84-0046fc15f323\"},\n        {\"id\": \"d507e1ee-3e73-4ee6-a74a-3d1f6b8cbe89\"}\n    ]\n}\n\n ```\n\n---\n\n**Для группы геозон:**\n\n```\n{\n    \"geozones_groups\": [\n        {\"id\": \"517fe368-e2fe-4a64-bd96-473f2a2d670f\"},\n        {\"id\": \"3789ac40-a076-48c1-85c2-a2d2515e6578\"}\n    ]\n}\n\n ```\n\n**Ответ:**\n\nВ теле ответа возращается kml файл",
        "operationId": "geozonesExportKml",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "geozones": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "0ca9f774-69fb-4a56-99ae-177f766fc291"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "0ca9f774-69fb-4a56-99ae-177f766fc291"
                      },
                      {
                        "id": "8b13e5d3-898a-4463-8f84-0046fc15f323"
                      },
                      {
                        "id": "d507e1ee-3e73-4ee6-a74a-3d1f6b8cbe89"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/geozones/export_kml": {
                  "value": {
                    "geozones": [
                      {
                        "id": "0ca9f774-69fb-4a56-99ae-177f766fc291"
                      },
                      {
                        "id": "8b13e5d3-898a-4463-8f84-0046fc15f323"
                      },
                      {
                        "id": "d507e1ee-3e73-4ee6-a74a-3d1f6b8cbe89"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/geozonesgroup": {
      "get": {
        "tags": [
          "Группы геозон"
        ],
        "summary": "/geozonesgroup?ids=geozone_id",
        "description": "**Получение группы геозон по id**\n\n---\n\nВозвращает группу геозон\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "geozonesgroupIdsGeozoneId",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Группы геозон"
        ],
        "summary": "/geozonesgroup",
        "description": "**Cоздание групп геозон**\n\n---\n\nВ body необходимо указать id геозоны, которая будет в группе и ее имя.\n\n```\n{\n    \"name\": \"geozoneName\",\n    \"geozones\" : [\n        {\n            \"id\" : \"geozoneId1\"\n        },\n        {\n            \"id\" : \"geozoneId2\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "geozonesgroup",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "geozones": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "geozoneId1"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "geozoneId1"
                      },
                      {
                        "id": "geozoneId2"
                      }
                    ]
                  },
                  "name": {
                    "type": "string",
                    "example": "geozoneName"
                  }
                }
              },
              "examples": {
                "/geozonesgroup": {
                  "value": {
                    "geozones": [
                      {
                        "id": "geozoneId1"
                      },
                      {
                        "id": "geozoneId2"
                      }
                    ],
                    "name": "geozoneName"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Группы геозон"
        ],
        "summary": "/geozonesgroup?ids=geozonesgroup_id",
        "description": "**Планирование удаления группы геозон**\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "geozonesgroupIdsGeozonesgroupId",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/geozonesgroup/list": {
      "post": {
        "tags": [
          "Группы геозон"
        ],
        "summary": "/geozonesgroup/list",
        "description": "**Получение списка групп геозон**\n\n---\n\nПоля:\n\nВ fields указать нужные поля.\n\n```\n{\"fields\":[\"geozones.id\", \"geozones.name\"]}\n\n ```\n\n---\n\n**Ответ:**\n\ngeozones.id - Id группы.\n\ngeozones.name - имя группы.",
        "operationId": "geozonesgroupList",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "geozones.id"
                    },
                    "example": [
                      "geozones.id",
                      "geozones.name"
                    ]
                  }
                }
              },
              "examples": {
                "/geozonesgroup/list": {
                  "value": {
                    "fields": [
                      "geozones.id",
                      "geozones.name"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/geozonesgroup/{geozonesgroup_id}": {
      "delete": {
        "tags": [
          "Группы геозон"
        ],
        "summary": "/geozonesgroup/:geozonegroup_id",
        "description": "**Удаление группы геозон**\n\n---\n\nГруппа удаляется физически.\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "geozonesgroupGeozonegroupId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "geozonesgroup_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор группы геозон (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "a82b4c10-91ef-42a1-b47a-9c7e4d5f6a11"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "geozonesgroup_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ],
      "put": {
        "tags": [
          "Группы геозон"
        ],
        "summary": "Обновление группы геозон",
        "description": "Обновление названия, цвета и списка входящих геозон.",
        "operationId": "geozonesgroup1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "geozones": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "286e35d1-0d2e-481a-89b7-91755aabef54"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      }
                    ]
                  },
                  "name": {
                    "type": "string",
                    "example": "Группа ДоставкаGezone"
                  }
                }
              },
              "examples": {
                "/geozonesgroup": {
                  "value": {
                    "geozones": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      }
                    ],
                    "name": "Группа ДоставкаGezone"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "geozonesgroup_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор группы геозон (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "a82b4c10-91ef-42a1-b47a-9c7e4d5f6a11"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/routes": {
      "get": {
        "tags": [
          "Маршруты"
        ],
        "summary": "/routes?ids=<ids1,ids2>",
        "description": "**Получение маршрутов**\n\n---\n\nВозвращает массив всех маршрутов.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Ответ:**\n\nЕсли запрашивается по одному id - вернется не массив, а один объект.\n\nЕсли запрос без id (просто GET /routes), то вернутся все маршруты.\n\n```\n/routes?ids=a321b5f0-f52c-4d36-9d39-f11ba64f9293\n\"{\n    \"id\":\"9817341d-474d-4468-9113-922637113f66\",\n    \"name\":\"route1\",\n    \"company_id\": \"ea0a3a44-ca90-4491-bb20-2c7f508da1c7\",\n    \"points\":[\n        {\n            \"name\": \"point1\",\n            \"type\" : {\n                \"key\": \"polygon\",\n                \"value\": \"Полигон\"\n            },\n            \"width\": 10,\n            \"geometry\": [\n               [37.541330, 55.772056],\n               [37.598908, 55.808941]\n            ]\n        },\n        {\n            \"name\": \"point2\",\n            \"type\" : {\n                \"key\": \"circle\",\n                \"value\": \"Круг\"\n            },\n            \"width\": 100,\n            \"geometry\": [\n               [37.541330, 55.772056]\n            ]\n        }\n    ]\n}\"\n\n ```",
        "operationId": "routesIdsIds1Ids2",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Маршруты"
        ],
        "summary": "/routes",
        "description": "**Создание маршрута**\n\n---\n\nДобавляет новый маршрут, присваивая id.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Параметры:**\n\n```\n{\n  \"name\": \"route1\", // название маршрута\n  \"points\":[\n      {\n          \"name\":\"point1\",// название точки\n          \"type\": {\"key\":\"polygon\"},  // тип точки, key = [point, circle, line, polygon] (можно добавлять \"type\":\"geozone_type\")\n          \"width\":20,//ширина\n          \"geometry\": [  //массив координат\n              [37.608734,55.793154],\n              [37.541330,55.772056],\n              [37.598908,55.808941]\n          ]\n      }\n  ]\n}\n\n ```\n\n**Ответ:**\n\nВозвращает созданную запись и ее id. Пустые поля не возвращаются.",
        "operationId": "routes",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Маршрут Москва — Тверь"
                  },
                  "points": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "coordinates": {
                          "type": "array",
                          "items": {
                            "type": "array",
                            "items": {
                              "type": "number",
                              "example": 37.608734
                            },
                            "example": [
                              37.608734,
                              55.793154
                            ]
                          },
                          "example": [
                            [
                              37.608734,
                              55.793154
                            ],
                            [
                              37.54133,
                              55.772056
                            ],
                            [
                              37.598908,
                              55.808941
                            ]
                          ]
                        },
                        "name": {
                          "type": "string",
                          "example": "point1"
                        },
                        "type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "polygon"
                            }
                          }
                        },
                        "width": {
                          "type": "number",
                          "example": 20
                        }
                      }
                    },
                    "example": [
                      {
                        "coordinates": [
                          [
                            37.608734,
                            55.793154
                          ],
                          [
                            37.54133,
                            55.772056
                          ],
                          [
                            37.598908,
                            55.808941
                          ]
                        ],
                        "name": "point1",
                        "type": {
                          "key": "polygon"
                        },
                        "width": 20
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/routes": {
                  "value": {
                    "name": "Маршрут Москва — Тверь",
                    "points": [
                      {
                        "coordinates": [
                          [
                            37.608734,
                            55.793154
                          ],
                          [
                            37.54133,
                            55.772056
                          ],
                          [
                            37.598908,
                            55.808941
                          ]
                        ],
                        "name": "point1",
                        "type": {
                          "key": "polygon"
                        },
                        "width": 20
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Маршруты"
        ],
        "summary": "/routes?ids=:ids",
        "description": "**Планирование удаление маршрута**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "routesIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/routes": {
                  "value": ""
                },
                "/routes?ids=:ids": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/routes/{id}": {
      "put": {
        "tags": [
          "Маршруты"
        ],
        "summary": "/routes/:id",
        "description": "**Обновление данных маршрута**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Параметры:**\n\nсм метод POST /routes\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /routes",
        "operationId": "routesId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                  },
                  "id": {
                    "type": "string",
                    "example": "0d2c5867-301f-468a-aa15-1095f95cc697"
                  },
                  "name": {
                    "type": "string",
                    "example": "Маршрут Москва — Тверь"
                  },
                  "points": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "coordinates": {
                          "type": "array",
                          "items": {
                            "type": "array",
                            "items": {
                              "type": "number",
                              "example": 37.608734
                            },
                            "example": [
                              37.608734,
                              55.793154
                            ]
                          },
                          "example": [
                            [
                              37.608734,
                              55.793154
                            ],
                            [
                              37.54133,
                              55.772056
                            ],
                            [
                              37.598908,
                              55.808941
                            ]
                          ]
                        },
                        "name": {
                          "type": "string",
                          "example": "point1"
                        },
                        "type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "polygon"
                            },
                            "type": {
                              "nullable": true,
                              "example": null
                            },
                            "value": {
                              "nullable": true,
                              "example": null
                            }
                          }
                        },
                        "width": {
                          "type": "number",
                          "example": 20
                        }
                      }
                    },
                    "example": [
                      {
                        "coordinates": [
                          [
                            37.608734,
                            55.793154
                          ],
                          [
                            37.54133,
                            55.772056
                          ],
                          [
                            37.598908,
                            55.808941
                          ]
                        ],
                        "name": "point1",
                        "type": {
                          "key": "polygon",
                          "type": null,
                          "value": null
                        },
                        "width": 20
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/routes/:id": {
                  "value": {
                    "company_id": "d88cb614-7d0e-48d5-ba95-0001825d68a8",
                    "id": "0d2c5867-301f-468a-aa15-1095f95cc697",
                    "name": "Маршрут Москва — Тверь",
                    "points": [
                      {
                        "coordinates": [
                          [
                            37.608734,
                            55.793154
                          ],
                          [
                            37.54133,
                            55.772056
                          ],
                          [
                            37.598908,
                            55.808941
                          ]
                        ],
                        "name": "point1",
                        "type": {
                          "key": "polygon",
                          "type": null,
                          "value": null
                        },
                        "width": 20
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Маршруты"
        ],
        "summary": "/routes/:id",
        "description": "**Удаление маршрута по его id**\n\n---\n\nУдаляет маршрут\n\n---\n\n**Параметры:**\n\nid маршрута\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\n200 Удаленный маршрут\n\nЕсли маршрут с таким id не найден, то возвращается ошибка 422\n\n```\n{\n  \"code\": 422,\n  \"field\": \"id\",\n  \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "routesId",
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/routes/:id": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID маршрута"
        }
      ]
    },
    "/api_v1/routes/list": {
      "post": {
        "tags": [
          "Маршруты"
        ],
        "summary": "/routes/list",
        "description": "**Получение маршрутов по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[name, created, is_delete, icon.key, color.key, type.key\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - name(можно искать по неполному слову), icon.key, icon.type, color.key, color.type, type.key, type.type\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 маршрутов, отсортированные по возрастанию, по имени, которые имеют имя \"route2\"\n\n```\n{\n                        \"from\":0,\n                        \"count\":10,\n                        \"sortField\":\"name\",\n                        \"sortDesc\":\"false\",                        \"conditions\":[\n                            { \"field\": \"name\", \"value\": \"route2\"}\n                        ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\":1,\n    \"list\":\n    [\n        {\"id\":\"80773471-1eb8-4b71-ad44-fcfd6d8c721a\",\n         \"name\":\"route2\",\n         \"points\":[\n            {                                        \"name\":\"point1\",\n                \"type\": {\"key\":\"polygon\", \"value\":\"Полигон\"}\",\n                \"width\":20,\n                \"geometry\": [[37.608734,55.793154],[37.541330,55.772056],[37.598908,55.808941]]\n            }\n         ]\n    ]\n}\n\n ```",
        "operationId": "routesList",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "name"
                        },
                        "value": {
                          "type": "string",
                          "example": "Маршрут Москва — Тверь"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "name",
                        "value": "Маршрут Москва — Тверь"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 1
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "sortDesc": {
                    "type": "string",
                    "example": "false"
                  },
                  "sortField": {
                    "type": "string",
                    "example": "name"
                  }
                }
              },
              "examples": {
                "/routes/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "name",
                        "value": "Маршрут Москва — Тверь"
                      }
                    ],
                    "count": 1,
                    "from": 0,
                    "sortDesc": "false",
                    "sortField": "name"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/trips": {
      "get": {
        "tags": [
          "Рейсы"
        ],
        "summary": "/trips?ids=<ids1,ids2>",
        "description": "**Получить рейсы**\n\n---\n\nВозвращает массив всех рейсов.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Ответ:**\n\nЕсли запрашивается по одному id - вернется не массив, а один объект.\n\nЕсли запрос без id (просто GET /trips), то вернутся все маршруты.\n\n```\n/trips?ids=41513f12-1773-43ed-92c5-197dac6b08a2\n{\n    \"id\": \"41513f12-1773-43ed-92c5-197dac6b08a2\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"name\": \"Рейс №101 (Доставка)\",\n    \"unit\": {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"user_id\": \"e8c262f8-942b-4c61-bb25-825d886e627a\",\n    \"dates\": [\n        \"2020-09-12 00:00:00\",\n        \"2020-09-13 00:00:00\",\n        \"2020-10-15 00:00:00\"\n    ],\n    \"activation_type\": {\n        \"key\": \"leaving_first_point\",\n        \"type\": \"trip_activation_type\",\n        \"value\": \"По выходу из первой точки\"\n    },\n    \"passage_order_type\": {\n        \"key\": \"strict\",\n        \"type\": \"trip_passage_order_type\",\n        \"value\": \"Строгий\"\n    },\n    \"work_types\": [\n        \"work1\",\n        \"work2\"\n    ],\n    \"points\": [\n        {\n            \"name\": \"point11\",\n            \"type\": {\n                \"key\": \"polygon\",\n                \"type\": \"geozone_type\",\n                \"value\": \"Полигон\"\n            },\n            \"geometry\": [\n                [\n                    37.442505,\n                    55.750298\n                ],\n                [\n                    37.421736,\n                    55.750956\n                ],\n                [\n                    37.422764,\n                    55.750934\n                ]\n            ],\n            \"departure\": {\n                \"time\": \"08:00\",\n                \"after_days\": 0,\n                \"deviation_minutes\": 10\n            }\n        },\n        {\n            \"name\": \"point22\",\n            \"type\": {\n                \"key\": \"circle\",\n                \"type\": \"geozone_type\",\n                \"value\": \"Круг\"\n            },\n            \"geometry\": [\n                [\n                    37.492764,\n                    55.770934\n                ]\n            ],\n            \"arrival\": {\n                \"time\": \"07:00\",\n                \"after_days\": 1,\n                \"deviation_minutes\": 10\n            },\n            \"departure\": {\n                \"time\": \"06:00\",\n                \"after_days\": 2,\n                \"deviation_minutes\": 15\n            }\n        },\n        {\n            \"name\": \"point33\",\n            \"type\": {\n                \"key\": \"polygon\",\n                \"type\": \"geozone_type\",\n                \"value\": \"Полигон\"\n            },\n            \"geometry\": [\n                [\n                    37.442505,\n                    55.750298\n                ],\n                [\n                    37.421736,\n                    55.750956\n                ],\n                [\n                    37.422764,\n                    55.750934\n                ]\n            ],\n            \"arrival\": {\n                \"time\": \"22:00\",\n                \"after_days\": 2,\n                \"deviation_minutes\": 10\n            }\n        }\n    ]\n}\n\n ```",
        "operationId": "tripsIdsIds1Ids2",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Рейсы"
        ],
        "summary": "/trips",
        "description": "**Создание рейса**\n\n---\n\nДобавляет новый рейс, присваивая id.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Параметры:**\n\n```\n{\n    \"name\": \"Рейс №101 (Доставка)\", //название, обязательное\n    \"unit\": { // объект, обязательное\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"trailer\": {// прицеп, необязательное\n        \"id\": \"4e00d717-fa03-4209-8771-a6ff71a4f65d\"\n    },\n    \"user_id\": \"e8c262f8-942b-4c61-bb25-825d886e627a\",// ID водителя, необязательное\n    \"activation_type\": { // Тип активации, получают из справочника type=trip_activation_type\n        \"key\": \"leaving_first_point\" // возможные ключи и значения: [{'time_of_first_point', 'По премени первой точки'},{'entrance_to_first_point', 'По входу в первую точку'},{'leaving_first_point', 'По выходу из первой точки'}]\n    },\n    \"passage_order_type\": {// Поядок прохождения получают из справочника type = trip_passage_order_type, обязательное\n        \"key\": \"strict\" // availeble keys and values[{'strict', Строгий},{'arbitrary', 'Произволный'}]\n    },\n    \"dates\": [\"2020-09-12\", \"2020-09-13 00:00\", \"2020-10-15 00:00:00\"], //Даты поездки, required,HH:mm::ss всегда должны быть указаны нули\n    \"work_types\": [\"work1\", \"work2\"], // типы работы, необязательное. Можно получить ранее добавленные значения по GET /work_types и можно добавить новые. Если добавить новые, их можно использовать при следующем добавление рейса\n    \"points\": [{ // массив точек, обязательное, описание во 2-точке\n        \"name\": \"point11\",\n        \"type\": {\n            \"key\": \"polygon\",\n            \"type\": \"geozone_type\",\n            \"value\": \"Полигон\"\n        },\n        \"departure\": {\n            \"time\": \"08:00\",\n            \"after_days\": 0,\n            \"deviation_minutes\": 10\n        },\n        \"geometry\":[\n            [37.442505, 55.750298],\n            [37.421736, 55.750956],\n            [37.422764, 55.750934]\n        ]\n    }, {\n        \"name\": \"point22\", // название точки, string, обязательное\n        \"type\": { // тип геозоны, object, обязательное\n            \"key\": \"circle\", // один из ['point', 'circle', 'line', 'polygon']\n            \"type\": \"geozone_type\", // всегда geozone_type\n            \"value\": \"Круг\"\n        },\n        \"arrival\": { // прибытие, object, необязательное\n            \"time\": \"07:00\", // время прибытия, string\n            \"after_days\": 0, // через сколько дней c начала поездки, int\n            \"deviation_minutes\": 10 // отклонение времени прибытия в минутах\n        },\n        \"departure\": { // отправления, object, необязательное\n            \"time\": \"06:00\",// время отправления, string\n            \"after_days\": 1, //через сколько дней c начала поездки, int\n            \"deviation_minutes\": 15 // отклонение времени отправления в минутах\n        },\n        \"geometry\": [ // координаты точки, обязательное\n            [37.492764, 55.770934]\n        ]\n    }, {\n        \"name\": \"point33\",\n        \"type\": {\n            \"key\": \"polygon\"\n        },\n        \"arrival\": {\n            \"time\": \"22:00\",\n            \"after_days\": 2,\n            \"deviation_minutes\": 10\n        },\n        \"geometry\":[\n            [37.442505, 55.750298],\n            [37.421736, 55.750956],\n            [37.422764, 55.750934]\n        ]\n    }]\n}\n\n ```\n\n**Ответ:**\n\nВозвращает созданную запись и ее id. Пустые поля не возвращаются.",
        "operationId": "trips",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "activation_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "leaving_first_point"
                      }
                    }
                  },
                  "dates": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "2020-09-12"
                    },
                    "example": [
                      "2020-09-12",
                      "2020-09-13 00:00",
                      "2020-10-15 00:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "example": "Рейс №101 (Доставка)"
                  },
                  "passage_order_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "strict"
                      }
                    }
                  },
                  "points": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "arrival": {
                          "type": "object",
                          "properties": {
                            "after_days": {
                              "type": "number",
                              "example": 1
                            },
                            "deviation_minutes": {
                              "type": "number",
                              "example": 10
                            },
                            "time": {
                              "type": "string",
                              "example": "07:00"
                            }
                          }
                        },
                        "coordinates": {
                          "type": "array",
                          "items": {
                            "type": "array",
                            "items": {
                              "type": "number",
                              "example": 37.442505
                            },
                            "example": [
                              37.442505,
                              55.750298
                            ]
                          },
                          "example": [
                            [
                              37.442505,
                              55.750298
                            ],
                            [
                              37.421736,
                              55.750956
                            ],
                            [
                              37.422764,
                              55.750934
                            ]
                          ]
                        },
                        "departure": {
                          "type": "object",
                          "properties": {
                            "after_days": {
                              "type": "number",
                              "example": 0
                            },
                            "deviation_minutes": {
                              "type": "number",
                              "example": 10
                            },
                            "time": {
                              "type": "string",
                              "example": "08:00"
                            }
                          }
                        },
                        "name": {
                          "type": "string",
                          "example": "point11"
                        },
                        "type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "polygon"
                            },
                            "type": {
                              "type": "string",
                              "example": "geozone_type"
                            },
                            "value": {
                              "type": "string",
                              "example": "Полигон"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "departure": {
                          "after_days": 0,
                          "deviation_minutes": 10,
                          "time": "08:00"
                        },
                        "name": "point11",
                        "type": {
                          "key": "polygon",
                          "type": "geozone_type",
                          "value": "Полигон"
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 1,
                          "deviation_minutes": 10,
                          "time": "07:00"
                        },
                        "coordinates": [
                          [
                            37.492764,
                            55.770934
                          ]
                        ],
                        "departure": {
                          "after_days": 2,
                          "deviation_minutes": 15,
                          "time": "06:00"
                        },
                        "name": "point22",
                        "type": {
                          "key": "circle"
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 2,
                          "deviation_minutes": 10,
                          "time": "22:00"
                        },
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "name": "point33",
                        "type": {
                          "key": "polygon"
                        }
                      }
                    ]
                  },
                  "trailer": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "4e00d717-fa03-4209-8771-a6ff71a4f65d"
                      }
                    }
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    }
                  },
                  "user_id": {
                    "type": "string",
                    "example": "e8c262f8-942b-4c61-bb25-825d886e627a"
                  },
                  "work_types": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "work1"
                    },
                    "example": [
                      "work1",
                      "work2"
                    ]
                  }
                }
              },
              "examples": {
                "/trips": {
                  "value": {
                    "activation_type": {
                      "key": "leaving_first_point"
                    },
                    "dates": [
                      "2020-09-12",
                      "2020-09-13 00:00",
                      "2020-10-15 00:00:00"
                    ],
                    "name": "Рейс №101 (Доставка)",
                    "passage_order_type": {
                      "key": "strict"
                    },
                    "points": [
                      {
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "departure": {
                          "after_days": 0,
                          "deviation_minutes": 10,
                          "time": "08:00"
                        },
                        "name": "point11",
                        "type": {
                          "key": "polygon",
                          "type": "geozone_type",
                          "value": "Полигон"
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 1,
                          "deviation_minutes": 10,
                          "time": "07:00"
                        },
                        "coordinates": [
                          [
                            37.492764,
                            55.770934
                          ]
                        ],
                        "departure": {
                          "after_days": 2,
                          "deviation_minutes": 15,
                          "time": "06:00"
                        },
                        "name": "point22",
                        "type": {
                          "key": "circle"
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 2,
                          "deviation_minutes": 10,
                          "time": "22:00"
                        },
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "name": "point33",
                        "type": {
                          "key": "polygon"
                        }
                      }
                    ],
                    "trailer": {
                      "id": "4e00d717-fa03-4209-8771-a6ff71a4f65d"
                    },
                    "unit": {
                      "id": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                    },
                    "user_id": "e8c262f8-942b-4c61-bb25-825d886e627a",
                    "work_types": [
                      "work1",
                      "work2"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Рейсы"
        ],
        "summary": "/trips?ids=:ids",
        "description": "**Планирование удаления рейсов**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "tripsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/trips": {
                  "value": ""
                },
                "/trips?ids=:ids": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/trips/{id}": {
      "put": {
        "tags": [
          "Рейсы"
        ],
        "summary": "/trips/:id",
        "description": "**Обновление данных рейса**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Параметры:**\n\nсм метод POST /trips\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /trips",
        "operationId": "tripsId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "activation_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "leaving_first_point"
                      },
                      "type": {
                        "type": "string",
                        "example": "trip_activation_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "По выходу из первой точки"
                      }
                    }
                  },
                  "company_id": {
                    "type": "string",
                    "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                  },
                  "dates": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "2020-09-12 00:00:00"
                    },
                    "example": [
                      "2020-09-12 00:00:00",
                      "2020-09-13 00:00:00",
                      "2020-10-15 00:00:00"
                    ]
                  },
                  "id": {
                    "type": "string",
                    "example": "db91e93d-202d-4cca-9bc9-883e237ff532"
                  },
                  "name": {
                    "type": "string",
                    "example": "Рейс №102 (Возврат)"
                  },
                  "passage_order_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "strict"
                      },
                      "type": {
                        "type": "string",
                        "example": "trip_passage_order_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Строгий"
                      }
                    }
                  },
                  "points": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "arrival": {
                          "type": "object",
                          "properties": {
                            "after_days": {
                              "type": "number",
                              "example": 1
                            },
                            "deviation_minutes": {
                              "type": "number",
                              "example": 10
                            },
                            "time": {
                              "type": "string",
                              "example": "07:00"
                            }
                          }
                        },
                        "coordinates": {
                          "type": "array",
                          "items": {
                            "type": "array",
                            "items": {
                              "type": "number",
                              "example": 37.442505
                            },
                            "example": [
                              37.442505,
                              55.750298
                            ]
                          },
                          "example": [
                            [
                              37.442505,
                              55.750298
                            ],
                            [
                              37.421736,
                              55.750956
                            ],
                            [
                              37.422764,
                              55.750934
                            ]
                          ]
                        },
                        "departure": {
                          "type": "object",
                          "properties": {
                            "after_days": {
                              "type": "number",
                              "example": 0
                            },
                            "deviation_minutes": {
                              "type": "number",
                              "example": 10
                            },
                            "time": {
                              "type": "string",
                              "example": "08:00"
                            }
                          }
                        },
                        "name": {
                          "type": "string",
                          "example": "point11"
                        },
                        "type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "polygon"
                            },
                            "type": {
                              "type": "string",
                              "nullable": true,
                              "example": "geozone_type"
                            },
                            "value": {
                              "type": "string",
                              "nullable": true,
                              "example": "Полигон"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "departure": {
                          "after_days": 0,
                          "deviation_minutes": 10,
                          "time": "08:00"
                        },
                        "name": "point11",
                        "type": {
                          "key": "polygon",
                          "type": "geozone_type",
                          "value": "Полигон"
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 1,
                          "deviation_minutes": 10,
                          "time": "07:00"
                        },
                        "coordinates": [
                          [
                            37.492764,
                            55.770934
                          ]
                        ],
                        "departure": {
                          "after_days": 2,
                          "deviation_minutes": 15,
                          "time": "06:00"
                        },
                        "name": "point22",
                        "type": {
                          "key": "circle",
                          "type": null,
                          "value": null
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 2,
                          "deviation_minutes": 10,
                          "time": "22:00"
                        },
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "name": "point33",
                        "type": {
                          "key": "polygon",
                          "type": null,
                          "value": null
                        }
                      }
                    ]
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    }
                  },
                  "user_id": {
                    "type": "string",
                    "example": "e8c262f8-942b-4c61-bb25-825d886e627a"
                  },
                  "work_types": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "work1"
                    },
                    "example": [
                      "work1",
                      "work2"
                    ]
                  }
                }
              },
              "examples": {
                "/trips/:id": {
                  "value": {
                    "activation_type": {
                      "key": "leaving_first_point",
                      "type": "trip_activation_type",
                      "value": "По выходу из первой точки"
                    },
                    "company_id": "d88cb614-7d0e-48d5-ba95-0001825d68a8",
                    "dates": [
                      "2020-09-12 00:00:00",
                      "2020-09-13 00:00:00",
                      "2020-10-15 00:00:00"
                    ],
                    "id": "db91e93d-202d-4cca-9bc9-883e237ff532",
                    "name": "Рейс №102 (Возврат)",
                    "passage_order_type": {
                      "key": "strict",
                      "type": "trip_passage_order_type",
                      "value": "Строгий"
                    },
                    "points": [
                      {
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "departure": {
                          "after_days": 0,
                          "deviation_minutes": 10,
                          "time": "08:00"
                        },
                        "name": "point11",
                        "type": {
                          "key": "polygon",
                          "type": "geozone_type",
                          "value": "Полигон"
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 1,
                          "deviation_minutes": 10,
                          "time": "07:00"
                        },
                        "coordinates": [
                          [
                            37.492764,
                            55.770934
                          ]
                        ],
                        "departure": {
                          "after_days": 2,
                          "deviation_minutes": 15,
                          "time": "06:00"
                        },
                        "name": "point22",
                        "type": {
                          "key": "circle",
                          "type": null,
                          "value": null
                        }
                      },
                      {
                        "arrival": {
                          "after_days": 2,
                          "deviation_minutes": 10,
                          "time": "22:00"
                        },
                        "coordinates": [
                          [
                            37.442505,
                            55.750298
                          ],
                          [
                            37.421736,
                            55.750956
                          ],
                          [
                            37.422764,
                            55.750934
                          ]
                        ],
                        "name": "point33",
                        "type": {
                          "key": "polygon",
                          "type": null,
                          "value": null
                        }
                      }
                    ],
                    "unit": {
                      "id": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                    },
                    "user_id": "e8c262f8-942b-4c61-bb25-825d886e627a",
                    "work_types": [
                      "work1",
                      "work2"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Рейсы"
        ],
        "summary": "/trips/:id",
        "description": "**Удаление рейса по его ID**\n\n---\n\n**Параметры:**\n\nid рейса\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\n200 Удаленный рейс\n\nЕсли рейс с таким id не найден возвращается ошибка 422\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "tripsId",
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/trips/:id": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID рейса"
        }
      ]
    },
    "/api_v1/trips/list": {
      "post": {
        "tags": [
          "Рейсы"
        ],
        "summary": "/trips/list",
        "description": "**Получение рейсов по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[name, created, is_delete\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - name (можно искать по неполному слову), unit.id, user_id, activation_type.key, passage_order_type.key\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 рейсов, отсортированные по возрастанию по имени, которые имеют ID объекта 7e1aaba2-625a-4a4c-b765-9934bec5a096\n\n```\n{\n                        \"from\":0,\n                        \"count\":10,\n                        \"sortField\":\"name\",\n                        \"sortDesc\":\"false\",                        \"conditions\":[\n                            { \"field\": \"unit.id\", \"value\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"}\n                        ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 1,\n    \"list\": [\n        {\n            \"id\": \"41513f12-1773-43ed-92c5-197dac6b08a2\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"name\": \"Рейс №101 (Доставка)\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"user_id\": \"e8c262f8-942b-4c61-bb25-825d886e627a\",\n            \"dates\": [],\n            \"activation_type\": {\n                \"key\": \"leaving_first_point\",\n                \"type\": null,\n                \"value\": null\n            },\n            \"passage_order_type\": {\n                \"key\": \"strict\",\n                \"type\": null,\n                \"value\": null\n            },\n            \"work_types\": [\n                \"work1\",\n                \"work2\"\n            ],\n            \"points\": [\n                {\n                    \"name\": \"point11\",\n                    \"type\": {\n                        \"key\": \"polygon\",\n                        \"type\": \"geozone_type\",\n                        \"value\": \"Полигон\"\n                    },\n                    \"geometry\": [\n                        [\n                            37.442505,\n                            55.750298\n                        ],\n                        [\n                            37.421736,\n                            55.750956\n                        ],\n                        [\n                            37.422764,\n                            55.750934\n                        ]\n                    ],\n                    \"departure\": {\n                        \"time\": \"08:00\",\n                        \"after_days\": 0,\n                        \"deviation_minutes\": 10\n                    }\n                },\n                {\n                    \"name\": \"point22\",\n                    \"type\": {\n                        \"key\": \"circle\",\n                        \"type\": \"geozone_type\",\n                        \"value\": \"Круг\"\n                    },\n                    \"geometry\": [\n                        [\n                            37.492764,\n                            55.770934\n                        ]\n                    ],\n                    \"arrival\": {\n                        \"time\": \"07:00\",\n                        \"after_days\": 1,\n                        \"deviation_minutes\": 10\n                    },\n                    \"departure\": {\n                        \"time\": \"06:00\",\n                        \"after_days\": 2,\n                        \"deviation_minutes\": 15\n                    }\n                },\n                {\n                    \"name\": \"point33\",\n                    \"type\": {\n                        \"key\": \"polygon\",\n                        \"type\": \"geozone_type\",\n                        \"value\": \"Полигон\"\n                    },\n                    \"geometry\": [\n                        [\n                            37.442505,\n                            55.750298\n                        ],\n                        [\n                            37.421736,\n                            55.750956\n                        ],\n                        [\n                            37.422764,\n                            55.750934\n                        ]\n                    ],\n                    \"arrival\": {\n                        \"time\": \"22:00\",\n                        \"after_days\": 2,\n                        \"deviation_minutes\": 10\n                    }\n                }\n            ]\n        }\n    ]\n}\n\n ```",
        "operationId": "tripsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "activation_type.key"
                        },
                        "value": {
                          "type": "string",
                          "example": "leaving_first_point"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "activation_type.key",
                        "value": "leaving_first_point"
                      },
                      {
                        "field": "passage_order_type.key",
                        "value": "strict"
                      }
                    ]
                  },
                  "sortField": {
                    "type": "string",
                    "example": "name"
                  }
                }
              },
              "examples": {
                "/trips/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "activation_type.key",
                        "value": "leaving_first_point"
                      },
                      {
                        "field": "passage_order_type.key",
                        "value": "strict"
                      }
                    ],
                    "sortField": "name"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/units": {
      "get": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units?ids=:ids",
        "description": "**Поиск объектов по ID (через запятую)**\n\n---\n\nВозвращает массив объектов.  \nЕсли параметр 'ids' пустой (т.е. запрос = 'GET /units', без параметра), то вернётся список всех объектов по всем компаниям пользователя, из которого исключаются удаленные юниты. Если ids не пустой (т.е. запрос = 'GET /units?ids=00215-54021..,25541-454754-4513..'), то вернётся список только из запрошенных юнитов.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретный объект.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\nПример ответа:\n\n```\n[\n   {\n      \"id\":\"2bcd95c4-d520-4203-89fc-b0d3a76a7d6b\",\n      \"name\":\"testName-1\",\n      \"type\":{\n         \"key\":\"farm_equipment\",\n         \"type\":\"unit_type\",\n         \"value\":\"Сельхозтехника\"\n      },\n      \"terminal_type\":{\n         \"key\":\"navtelecom\",\n         \"type\":\"terminal_type\",\n         \"value\":\"navtelecom\"\n      },\n      \"imei\":\"743b075b-3006-4450-83f8-46d80b13586b\",\n      \"phonenumber\":\"8(914)3333333\",\n      \"units_groups_names\": \"ТЕст123, НОДГП-1 (НОДГП-1 Кокшетау), Ntcn, все тест, Новая, НЖС-1 (ЭЧ-8 Астана)\",\n      \"icon\":{\n         \"key\":\"bus\",\n         \"type\":\"unit_icon\",\n         \"value\":\"Автобус\"\n      },\n      \"services\":[\n         {\n            \"id\":\"e257e819-5d09-4da2-8ee4-9c072fef6de0\",\n            \"unit_id\":\"2bcd95c4-d520-4203-89fc-b0d3a76a7d6b\",\n            \"name\":\"ТО-1 (Замена масла)\",\n            \"description\":\"dumb service for test\",\n            \"isActiveKm\":true,\n            \"intervalKm\":10000,\n            \"lastKm\":45000,\n            \"isActiveDays\":true,\n            \"intervalDays\":300,\n            \"lastDays\":\"2019-06-03\",\n            \"activeKm\":true,\n            \"activeDays\":true\n         }\n      ],\n      \"sensors\":[\n         {\n            \"id\":\"49d91500-6582-4a8c-a341-215fe2e11279\",\n            \"unit_id\":\"2bcd95c4-d520-4203-89fc-b0d3a76a7d6b\",\n            \"name\":\"testSensor\",\n            \"type\":{\n               \"key\":\"ignition\",\n               \"type\":\"sensor_type\",\n               \"value\":\"translate.sensor_type.ignition\"\n            },\n            \"param1\":{\n                    \"param_key\": \"dut_485_1\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 2.0, \"b\": 3.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 5.0 }]\n                },\n                \"param2\":{\n                    \"param_key\": \"dut_485_2\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 1.0, \"b\": 1.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 2.0 }]\n                },\n            \"formula\": \"S1\"\n         }\n      ],\n      \"custom_fields\":[\n         {\"key\": limit\", \"value\": \"123\"},\n         {\"key\": \"power\", \"value\": \"123kw\"}\n      ]\n   },\n   {\n      \"id\":\"3f64e76d-0ff6-46ec-90dc-baadb89733f0\",\n      \"name\":\"testName-2\",\n      \"type\":{\n         \"key\":\"farm_equipment\",\n         \"type\":\"unit_type\",\n         \"value\":\"Сельхозтехника\"\n      },\n      \"terminal_type\":{\n         \"key\":\"navtelecom\",\n         \"type\":\"terminal_type\",\n         \"value\":\"navtelecom\"\n      },\n      \"imei\":\"1406dfa0-1a6b-4cce-be8e-5d41d1eb71c9\",\n      \"phonenumber\":\"8(914)3333333\",\n      \"icon\":{\n         \"key\":\"bus\",\n         \"type\":\"unit_icon\",\n         \"value\":\"Автобус\"\n      },\n      \"services\":[\n         {\n            \"id\":\"f19f6da9-d010-4ffe-87cc-3fa9c40667cc\",\n            \"unit_id\":\"3f64e76d-0ff6-46ec-90dc-baadb89733f0\",\n            \"name\":\"ТО-1 (Замена масла)\",\n            \"description\":\"dumb service for test\",\n            \"isActiveKm\":true,\n            \"intervalKm\":10000,\n            \"lastKm\":45000,\n            \"isActiveDays\":true,\n            \"intervalDays\":300,\n            \"lastDays\":\"2019-06-03\",\n            \"activeKm\":true,\n            \"activeDays\":true\n         }\n      ],\n      \"sensors\":[\n         {\n            \"id\":\"bd41f2a6-56c6-46b7-97f1-1ac1096ad81b\",\n            \"unit_id\":\"3f64e76d-0ff6-46ec-90dc-baadb89733f0\",\n            \"name\":\"testSensor\",\n            \"type\":{\n               \"key\":\"ignition\",\n               \"type\":\"sensor_type\",\n               \"value\":\"translate.sensor_type.ignition\"\n            },\n            \"param1\":\"voltage_main\",\n            \"param2\":\"speedkph\",\n            \"formula\":\"S\",\n            \"calibrations\":[\n               {\n                  \"id\":\"b2a45781-f05f-4553-be86-9320334ce864\",\n                  \"sensor_id\":\"bd41f2a6-56c6-46b7-97f1-1ac1096ad81b\",\n                  \"fromValue\":3.0,\n                  \"a\":1.5,\n                  \"b\":2.0,\n                  \"param_key\":\"speedkph\"\n               }\n            ]\n         }\n      ],\n      \"custom_fields\":[\n            {\"name\":\"Игнорировать сообщения после начала движения\",\"key\":\"fuel_fillings_msgignorestart\",\"value\":60.0},\n                {\"name\":\"Мин. время остановки для определения слива\",\"key\":\"fuel_fillings_minstaytheft\",\"value\":60.0},\n                {\"name\":\"Минимальный объем слива\",\"key\":\"fuel_fillings_minitheft\",\"value\":10.0}\n      ]\n   }\n]\n\n ```",
        "operationId": "unitsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units",
        "description": "**Создание объекта**\n\n---\n\n**Параметры:**\n\n```\n\"name\": \"Автомобиль обычный-1\" // Номер, наименование объекта,\n\"type\": {\"key\":\"transport\"} // Тип объекта (из dictionary, все ключи с типом 'unit_type'),\n\"terminal_type\":{\"key\": \"navtelecom\"} // Тип устройства (из dictionary, все ключи с типом 'terminal_type'),\n\"imei\": \"862531040000001\" // imei устройства\n\"phonenumber\": \"+79990000001\" // номер телефона\n\"phonenumber2\": \"+79990000003\" // второй номер телефона\n\"icon\": {\"key\":\"car_blue\"} // ключ иконки (из dictionary, все ключи с типом 'unit_icon')\nдоп поля: // смотри GET /custom_fields, ссылка ниже.\n\"custom_fields\": [\n    {\"name\": \"analist\", 'key': 'analist', \"value\": \"Петров\"},\n    {\"name\": \"counters_mileagekey\", \"key\": \"counters_mileagekey\", \"value\": \"gps_mileage\"},\n    {\"name\": \"counters_mileagecurr\", \"key\": \"counters_mileagecurr\", \"value\": \"2400\"},\n    {\"name\": \"tripdetector_movedetectkey\", \"key\": \"tripdetector_movedetectkey\", \"value\": \"speed\"},\n    {\"name\": \"Минимальный объем заправки\", \"key\": \"fuel_fillings_minfilling\", \"value\": \"10\"},\n    {\"name\": \"advanced_mileagecoeff\", \"key\": \"advanced_mileagecoeff\", \"value\": \"1.0\"},\n    {\"name\": \"Видео устройство\", \"key\": \"video_device_name\", \"value\": \"CARVIS\", \"group\": \"cf_etc\"},\n    {\"name\": \"ID-видео устройства\", \"key\": \"video_device_id\", \"value\": \"3432426544\", \"group\": \"cf_etc\"},\n    {\"name\": \"Камеры\", \"key\": \"video_cameras\", \"value\": \"0,1,2\", \"group\": \"cf_etc\"}\nСмены:\n\"drivers\": [\n        {\n            \"user\": { // Водитель\n                \"id\": \"bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c\"\n            },\n            \"date_from\": \"2022-10-03 00:00:00\", // от\n            \"date_to\": \"2022-10-04 00:00:00\"// до\n        },\n        {\n            \"user\": {\n                \"id\": \"bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c\"\n            },\n            \"date_from\": \"2022-10-05 00:00:00\",\n            \"date_to\": \"2022-10-10 00:00:00\"\n        }\n    ],\nНазначение прицепов\n    \"trailers\": [\n        {\n            \"trailer\": { // Прицеп\n                \"id\": \"fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6\"\n            },\n            \"date_from\": \"2022-10-03 00:00:00\", // от\n            \"date_to\": \"2022-10-04 00:00:00\" // до\n        },\n        {\n            \"trailer\": {\n                \"id\": \"d0bc0903-702b-4d96-826a-e26860681356\"\n            },\n            \"date_from\": \"2022-10-05 00:00:00\",\n            \"date_to\": \"2022-10-10 00:00:00\"\n        }\n    ],\n\"services\": [{\n    \"id\":\"23453-5435345-234345345-34534533\" // ОПЦИОНАЛЬНО ! Если сервис уже сохранен в БД и имеет id, то для его маппинга на текущий создаваемый юнит, необходимо указать его id, если сервис будет создаваться вместе с юнитом, то параметра \"id\" быть не должно.\n    \"name\": \"Очередное ТО\" // наименование сервиса,\n    \"description\": \"ваш текст\" // описание,\n    \"isActiveKm\": \"true\" // активно или нет по км,\n    \"intervalKm\": \"10000\" // периодичность по км,\n    \"lastKm\": \"45000\" // последний раз по км,\n    \"isActiveDays\": \"true\" // активно или нет по дням,\n    \"intervaldays\": \"60\" // периодичность по дням,\n    \"lastdays\": \"2019-05-14\" // последний раз по дням (Формат yyyy-MM-dd),\n    \"isActiveMotohours\": \"true\" // активно или нет по моточасам,\n    \"intervalMotohours\": \"1200\" // периодичность по моточасам,\n    \"lastMotohours\": \"14000\" // последний раз по моточасам\n}]\nДатчики (Можно создавать отдельно через /units/sensors (без привязки к unit) или /units/:unit_id/sensors (с привязкой к unit)):\nsensors:[{\n    \"id\":\"23453-5435345-234345345-34534533\" // ОПЦИОНАЛЬНО ! Если сенсор уже сохранен в БД и имеет id, то для его маппинга на текущий создаваемый юнит, необходимо указать его id, если сенсор будет создаваться вместе с юнитом, то параметра \"id\" быть не должно.\n    \"name\": \"Зажигание\" // Название датчика ,\n    \"type\": {\"key\":\"ignition\"} // тип датчика (из dictrionary, все ключи с типом \"sensor_type\"),\n    \"param1\":{ // Параметр №1 сенсора. Под примером доп.инфа.\n            \"param_key\": \"dut_485_1\", // ключ параметрa, должен быть в списке разрешенных ключей для конкретного терминала (/units/sensors/params)\n            \"calibrationABlist\": // Лист калибровок AB\n                [{\n                    \"fromValue\": 1.0, // нижняя граница\n                    \"a\": 2.0,    // коэффициент А\n                    \"b\": 3.0    // коэффициент B\n                }],\n            \"calibrationXYlist\": // Лист калибровок AB\n                [{\n                    \"x\": 1.0,    // коэффициент X\n                    \"y\": 5.0    // коэффициент Y\n                }]\n    },\n    \"param2\":{ // Параметр №2 сенсора. Под примером доп.инфа.\n            \"param_key\": \"dut_485_2\",\n            \"calibrationABlist\":\n                [{\n                    \"fromValue\": 1.0,\n                    \"a\": 1.0,\n                    \"b\": 1.0\n                }],\n            \"calibrationXYlist\":\n                [{\n                    \"x\": 1.0,\n                    \"y\": 2.0\n                }]\n    },\n    \"hide_in_reports\": false, // флажок используется, чтобы скрыть в отчетах, По умолчанию false\n    \"hide_in_monitoring\": true, // флажок используется чтобы скрыть значение датчика в мониторинге, По умолчанию false\n    \"formula\": \"S1\" // формула связки параметра 1 и параметра 2.         Полный список возможных значений лежит в Dictionaries по ключу \"formula\"\n     \"expression\": \"$param + ${Пробег} / 100\"// выражения формулы, это поле нужно только в случае formula=EXPR и имеет следующие синтаксисы 1) обращение к значениям любого параметра из сырых данных -  #param333 (обращение к параметру param333)\n     \"retrans_param_name\": \"fuel_level_1\",Ретранслировать в параметр, необязательное поле\n2)обращение к параметру текущего датчика - $param\nконстанты - 1000 (константа 1000)\n3)обращение к значению других датчиков ${Название датчика}\n4)арифметические операции - + * / ^(степень)\nскобки - ( или )\n},\n}]\n\n ```\n\nПо доп. полям смотрите [GET /custom_fields](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#05ee6204-6755-48ec-aeac-ba53f1041e9e)\n\nОписание param1, param2 сенсора: Данные параметры являются опциональными и если пользователь их не заполнил, то передавать их вообще не надо. Перед сохранением param1 и param2 происходит пересчет их внутренних калибровочных листов (калибровкиAB и КалибровкиXY). Лист КалибровокAB и лист калибровокXY у конкретного параметра взаимосвязаны и порождают друг друга по определенным формулам, т.е. из листа калибровок XY можно вычислить лист калибровок AB и наоборот.\n\nВ связи с этим РЕКОМЕНДУЕТСЯ перед тем, как сделать запрос, предварительно использовать метод [POST /units/sensors/recalc](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#e6cca9ca-c162-4c2a-ae5b-a762aa3a6500) для пересчета этих листов и передавать в calibrationABlist и calibrationXYlist результат работы этого метода.\n\nПосле создания, создается объект с привязкой объекта к компании пользователя.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример ответа:**\n\nВозвращается созданный объект\n\n```\n[{\n        \"id\": \"72154648-1f0d-4acc-a74d-81c7926e4483\",\n        \"type\": {\n                \"key\":\"farm_equipment\",\n                \"type\":\"unit_type\",\n                \"value\":\"Сельхозтехника\"\n        },\n        \"is_delete\": 0,\n        \"company_id\": \"d12c453b-d25c-445a-9e5b-ee9f9d4b7dff\",\n        \"name\": \"Scania А123АА777\",\n        \"terminal_type\":  {\n                \"key\":\"navtelecom\",\n                \"type\":\"terminal_type\",\n                \"value\":\"navtelecom\"\n        },\n        \"imei\": \"862531040000002\",\n        \"phonenumber\": \"+79990000002\",\n        \"icon\": {\n                \"key\":\"bus\",\n                \"type\":\"unit_icon\",\n                \"value\":\"автобус\"\n        },\n        custom_fields: [\n                {\"name\":\"Игнорировать сообщения после начала движения\",\"key\":\"fuel_fillings_msgignorestart\",\"value\":60.0},\n                {\"name\":\"Мин. время остановки для определения слива\",\"key\":\"fuel_fillings_minstaytheft\",\"value\":60.0},\n                {\"name\":\"Минимальный объем слива\",\"key\":\"fuel_fillings_minitheft\",\"value\":10.0},\n                {\"name\":\"Мин. время стоянки\",\"key\":\"tripdetector_minparktime\",\"value\":300.0},\n                {\"name\":\"Коэффициент пробега\",\"key\":\"advanced_mileagecoeff\",\"value\":1.0},\n                {\"name\":\"Мин. скорость движения\",\"key\":\"tripdetector_minmovespeed\",\"value\":3.0},\n                {\"name\":\"Мин. расстояние поездки\",\"key\":\"tripdetector_mintripdist\",\"value\":100.0}\n        ],\n        \"services\": [{\n                \"id\": \"1e83e291-690e-491e-84ee-e0d3e1397055\",\n                \"unit_id\": \"72154648-1f0d-4acc-a74d-81c7926e4483\",\n                \"name\": \"Очередное ТО\",\n                \"description\": \"\",\n                \"isactiveKm\": 1,\n                \"intervalKm\": 10000,\n                \"lastkm\": 45000,\n                \"isActiveDays\": 1,\n                \"intervalDays\": 60,\n                \"lastDays\": \"2019-05-14 05:00:00\",\n                \"isActiveMotohours\": true,\n                \"intervalMotohours\": 1200,\n                \"lastMotohours\": 18600,\n        }],\n        \"sensors\": [{\n                \"id\": \"3c5b7072-abd5-4095-8be7-02d4b75751c0\",\n                \"unit_id\": \"72154648-1f0d-4acc-a74d-81c7926e4483\",\n                \"name\": \"Зажигание\",.\n                \"typekey\": \"ignition\",\n                \"param1\":{\n                    \"param_key\": \"dut_485_1\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 2.0, \"b\": 3.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 5.0 }]\n                },\n                \"param2\":{\n                    \"param_key\": \"dut_485_2\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 1.0, \"b\": 1.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 2.0 }]\n                },\n                \"formula\": \"S1\",\n                \"hide_in_reports\": false,\n                \"hide_in_monitoring\": false\n        }]\n}]\n\n ```",
        "operationId": "units",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "custom_fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "group": {
                          "type": "string",
                          "example": "cf_custom"
                        },
                        "key": {
                          "type": "string",
                          "example": "S-2551"
                        },
                        "name": {
                          "type": "string",
                          "example": "S-2551"
                        },
                        "sort": {
                          "type": "number",
                          "example": 0
                        },
                        "value": {
                          "type": "string",
                          "example": "#31"
                        }
                      }
                    },
                    "example": [
                      {
                        "group": "cf_custom",
                        "key": "S-2551",
                        "name": "S-2551",
                        "sort": 0,
                        "value": "#31"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minparktime",
                        "name": "Мин. время стоянки (сек)",
                        "sort": 1,
                        "value": "600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minfilling",
                        "name": "Мин. объем заправки",
                        "sort": 1,
                        "value": "20"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_summerconsump",
                        "name": "Расход летом (л/100км.)",
                        "sort": 1,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "analyst",
                        "name": "Аналитик",
                        "sort": 1,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_mileagecoeff",
                        "name": "Коэф. пробега",
                        "sort": 2,
                        "value": "1.0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_msgignorestart",
                        "name": "Игнор-ть сообщ-я после начала движения",
                        "sort": 2,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterconsump",
                        "name": "Расход зимой (л/100км.)",
                        "sort": 2,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "installer",
                        "name": "Установщик",
                        "sort": 2,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minmovespeed",
                        "name": "Мин. скорость движ-я (км/ч)",
                        "sort": 3,
                        "value": "1"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minstaytheft",
                        "name": "Мин. время остановки для опр-ия слива",
                        "sort": 3,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingsummer",
                        "name": "На холостом ходу летом (л./час.)",
                        "sort": 3,
                        "value": "0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minitheft",
                        "name": "Мин. объем слива",
                        "sort": 4,
                        "value": "25"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_date",
                        "name": "Дата установки",
                        "sort": 4,
                        "value": "16.07.2019"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingwinter",
                        "name": "На холостом ходу зимой (л./час.)",
                        "sort": 4,
                        "value": "0"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintripdist",
                        "name": "Мин. расст-ие поездки (м)",
                        "sort": 4,
                        "value": "100"
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_maxintervalmsg",
                        "name": "Макс. интервал между сообщ-ми (сек)",
                        "sort": 5,
                        "value": "3600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_coeffunderload",
                        "name": "Коэф. при движении под нагрузкой",
                        "sort": 5,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_place",
                        "name": "Место установки в ТС",
                        "sort": 5,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_maxdistancemsg",
                        "name": "Макс. расст-ие между сообщ-ми (м)",
                        "sort": 6,
                        "value": "1000"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterfrom",
                        "name": "Первый месяц зимы (январь-1)",
                        "sort": 6,
                        "value": "11"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number",
                        "name": "Серийный номер терминала",
                        "sort": 6,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintriptime",
                        "name": "Мин. время поездки (сек)",
                        "sort": 7,
                        "value": "300"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterto",
                        "name": "Последний месяц зимы (январь-1)",
                        "sort": 7,
                        "value": "3"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut",
                        "name": "Серийный номер ДУТ",
                        "sort": 7,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_price",
                        "name": "Стоимость (1 л.)",
                        "sort": 8,
                        "value": "45"
                      },
                      {
                        "group": "cf_trips",
                        "key": "key_tripdetector_movedetect",
                        "name": "Опр-ие движ-я",
                        "sort": 8,
                        "value": "speedkph"
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut_seal_serial_number",
                        "name": "Серийный номер пломбы ДУТ",
                        "sort": 8,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mileagedetect",
                        "name": "Определение пробега",
                        "sort": 9,
                        "value": "mileage_GPS"
                      },
                      {
                        "group": "cf_etc",
                        "key": "license_plate_number",
                        "name": "Гос номер",
                        "sort": 9,
                        "value": ""
                      },
                      {
                        "group": "cf_motohours",
                        "key": "key_motohourdetector",
                        "name": "Определение моточасов",
                        "sort": 10,
                        "value": "ignition"
                      },
                      {
                        "group": "cf_etc",
                        "key": "hours_rate",
                        "name": "Норма часов в день",
                        "sort": 10,
                        "value": "8"
                      },
                      {
                        "group": "cf_etc",
                        "key": "block_date",
                        "name": "Дата блокировки(yyyy-MM-dd)",
                        "sort": 11,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "kp",
                        "name": "КП",
                        "sort": 12,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut",
                        "name": "ДУТ",
                        "sort": 13,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "second_sim",
                        "name": "Вторая sim",
                        "sort": 14,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_1",
                        "name": "Серийный номер ДУТ 1",
                        "sort": 15,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_2",
                        "name": "Серийный номер ДУТ 2",
                        "sort": 16,
                        "value": ""
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagekey",
                        "name": "translate.custom_fields.name.counters_mileagekey",
                        "sort": 1000,
                        "value": "gps_mileage"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagecurr",
                        "name": "translate.custom_fields.name.counters_mileagecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileageauto",
                        "name": "translate.custom_fields.name.counters_mileageauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_engienecurr",
                        "name": "translate.custom_fields.name.counters_engienecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprscurr",
                        "name": "translate.custom_fields.name.counters_gprscurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprsauto",
                        "name": "translate.custom_fields.name.counters_gprsauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_speedlimit",
                        "name": "translate.custom_fields.name.advanced_speedlimit",
                        "sort": 1000,
                        "value": "130"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_urbspeedlimit",
                        "name": "translate.custom_fields.name.advanced_urbspeedlimit",
                        "sort": 1000,
                        "value": "60"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_dailyengine",
                        "name": "translate.custom_fields.name.advanced_dailyengine",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_movedetectkey",
                        "name": "translate.custom_fields.name.tripdetector_movedetectkey",
                        "sort": 1000,
                        "value": "speed"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_gpscorrect",
                        "name": "translate.custom_fields.name.tripdetector_gpscorrect",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_minsatellites",
                        "name": "translate.custom_fields.name.tripdetector_minsatellites",
                        "sort": 1000,
                        "value": "3"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_mintipdist",
                        "name": "translate.custom_fields.name.tripdetector_mintipdist",
                        "sort": 1000,
                        "value": "100"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_fillingstop",
                        "name": "translate.custom_fields.name.fuel_fillings_fillingstop",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_ignorefiltration",
                        "name": "translate.custom_fields.name.fuel_fillings_ignorefiltration",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenameslevel",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenameslevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenamesconsum",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenamesconsum",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_timelevel",
                        "name": "translate.custom_fields.name.fuel_sensors_timelevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_filtervalues",
                        "name": "translate.custom_fields.name.fuel_sensors_filtervalues",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_idling",
                        "name": "translate.custom_fields.name.fuel_math_idling",
                        "sort": 1000,
                        "value": "2"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_urbcycle",
                        "name": "translate.custom_fields.name.fuel_math_urbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_suburbcycle",
                        "name": "translate.custom_fields.name.fuel_math_suburbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_levelsensors",
                        "name": "translate.custom_fields.name.fuel_level_levelsensors",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_repivalid",
                        "name": "translate.custom_fields.name.fuel_level_repivalid",
                        "sort": 1000,
                        "value": "true"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_impulsefuel",
                        "name": "translate.custom_fields.name.fuel_level_impulsefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_maximpulse",
                        "name": "translate.custom_fields.name.fuel_level_maximpulse",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_skipfirstzero",
                        "name": "translate.custom_fields.name.fuel_level_skipfirstzero",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_absolutefuel",
                        "name": "translate.custom_fields.name.fuel_level_absolutefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_instantfuel",
                        "name": "translate.custom_fields.name.fuel_level_instantfuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_diagnostic",
                        "key": "battery_charge_level_diagnostic",
                        "name": "translate.custom_fields.name.battery_charge_level_diagnostic",
                        "sort": 1,
                        "value": "diagnostic_ten_min"
                      }
                    ]
                  },
                  "drivers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "date_from": {
                          "type": "string",
                          "example": "2022-10-03 00:00:00"
                        },
                        "date_to": {
                          "type": "string",
                          "example": "2022-10-04 00:00:00"
                        },
                        "user": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      }
                    ]
                  },
                  "icon": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "excavator_green"
                      },
                      "type": {
                        "type": "string",
                        "example": "unit_icon"
                      },
                      "value": {
                        "type": "string",
                        "example": "Иконка"
                      }
                    }
                  },
                  "imei": {
                    "type": "string",
                    "example": "12345"
                  },
                  "name": {
                    "type": "string",
                    "example": "КамАЗ 5490"
                  },
                  "phonenumber": {
                    "type": "string",
                    "example": "+79990000005"
                  },
                  "phonenumber2": {
                    "type": "string",
                    "example": "+21312123231"
                  },
                  "sensors": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "formula": {
                          "type": "string",
                          "example": "S1"
                        },
                        "hide_in_reports": {
                          "type": "boolean",
                          "example": false
                        },
                        "invalid": {
                          "type": "boolean",
                          "example": false
                        },
                        "name": {
                          "type": "string",
                          "example": "ДУТ-1"
                        },
                        "param1": {
                          "type": "object",
                          "properties": {
                            "calibrationABlist": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "a": {
                                    "type": "number",
                                    "example": 0.087
                                  },
                                  "b": {
                                    "type": "number",
                                    "example": 0
                                  },
                                  "fromValue": {
                                    "type": "number",
                                    "example": 0
                                  }
                                }
                              },
                              "example": [
                                {
                                  "a": 0.087,
                                  "b": 0,
                                  "fromValue": 0
                                },
                                {
                                  "a": 0.0282,
                                  "b": 6.7606,
                                  "fromValue": 115
                                },
                                {
                                  "a": 0.0312,
                                  "b": 5.3583,
                                  "fromValue": 470
                                },
                                {
                                  "a": 0.0332,
                                  "b": 3.7209,
                                  "fromValue": 791
                                },
                                {
                                  "a": 0.0383,
                                  "b": -1.8391,
                                  "fromValue": 1092
                                },
                                {
                                  "a": 0.0394,
                                  "b": -3.2677,
                                  "fromValue": 1353
                                },
                                {
                                  "a": 0.0413,
                                  "b": -6.405,
                                  "fromValue": 1607
                                },
                                {
                                  "a": 0.0412,
                                  "b": -6.0905,
                                  "fromValue": 1849
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.3548,
                                  "fromValue": 2092
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.3548,
                                  "fromValue": 2216
                                },
                                {
                                  "a": 0.042,
                                  "b": -8.3193,
                                  "fromValue": 2340
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.1532,
                                  "fromValue": 2459
                                },
                                {
                                  "a": 0.0389,
                                  "b": -0.5058,
                                  "fromValue": 2583
                                },
                                {
                                  "a": 0.045,
                                  "b": -17.9279,
                                  "fromValue": 2840
                                },
                                {
                                  "a": 0.0398,
                                  "b": -1.992,
                                  "fromValue": 3062
                                },
                                {
                                  "a": 0.0405,
                                  "b": -4.1295,
                                  "fromValue": 3313
                                },
                                {
                                  "a": 0.0426,
                                  "b": -11.4893,
                                  "fromValue": 3560
                                },
                                {
                                  "a": 0.0625,
                                  "b": -90.9375,
                                  "fromValue": 3983
                                },
                                {
                                  "a": 0.0625,
                                  "b": -90.9375,
                                  "fromValue": 4095
                                }
                              ]
                            },
                            "calibrationXYlist": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "x": {
                                    "type": "number",
                                    "example": 0
                                  },
                                  "y": {
                                    "type": "number",
                                    "example": 0
                                  }
                                }
                              },
                              "example": [
                                {
                                  "x": 0,
                                  "y": 0
                                },
                                {
                                  "x": 115,
                                  "y": 10
                                },
                                {
                                  "x": 470,
                                  "y": 20
                                },
                                {
                                  "x": 791,
                                  "y": 30
                                },
                                {
                                  "x": 1092,
                                  "y": 40
                                },
                                {
                                  "x": 1353,
                                  "y": 50
                                },
                                {
                                  "x": 1607,
                                  "y": 60
                                },
                                {
                                  "x": 1849,
                                  "y": 70
                                },
                                {
                                  "x": 2092,
                                  "y": 80
                                },
                                {
                                  "x": 2216,
                                  "y": 85
                                },
                                {
                                  "x": 2340,
                                  "y": 90
                                },
                                {
                                  "x": 2459,
                                  "y": 95
                                },
                                {
                                  "x": 2583,
                                  "y": 100
                                },
                                {
                                  "x": 2840,
                                  "y": 110
                                },
                                {
                                  "x": 3062,
                                  "y": 120
                                },
                                {
                                  "x": 3313,
                                  "y": 130
                                },
                                {
                                  "x": 3560,
                                  "y": 140
                                },
                                {
                                  "x": 3983,
                                  "y": 158
                                },
                                {
                                  "x": 4095,
                                  "y": 165
                                }
                              ]
                            },
                            "max_valid": {
                              "type": "number",
                              "example": 4096
                            },
                            "min_valid": {
                              "type": "number",
                              "example": 1
                            },
                            "param_key": {
                              "type": "string",
                              "example": "dut_485_1"
                            },
                            "smoothing": {
                              "type": "number",
                              "example": 0
                            }
                          }
                        },
                        "param2": {
                          "type": "object",
                          "properties": {
                            "calibrationABlist": {
                              "type": "array",
                              "items": {},
                              "example": []
                            },
                            "calibrationXYlist": {
                              "type": "array",
                              "items": {},
                              "example": []
                            },
                            "param_key": {
                              "type": "string",
                              "example": "skif_text"
                            },
                            "smoothing": {
                              "type": "number",
                              "example": 0
                            }
                          }
                        },
                        "type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "fuelsensor"
                            },
                            "type": {
                              "type": "string",
                              "example": "sensor_type"
                            },
                            "value": {
                              "type": "string",
                              "example": "Датчик топлива"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "ДУТ-1",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0.087,
                              "b": 0,
                              "fromValue": 0
                            },
                            {
                              "a": 0.0282,
                              "b": 6.7606,
                              "fromValue": 115
                            },
                            {
                              "a": 0.0312,
                              "b": 5.3583,
                              "fromValue": 470
                            },
                            {
                              "a": 0.0332,
                              "b": 3.7209,
                              "fromValue": 791
                            },
                            {
                              "a": 0.0383,
                              "b": -1.8391,
                              "fromValue": 1092
                            },
                            {
                              "a": 0.0394,
                              "b": -3.2677,
                              "fromValue": 1353
                            },
                            {
                              "a": 0.0413,
                              "b": -6.405,
                              "fromValue": 1607
                            },
                            {
                              "a": 0.0412,
                              "b": -6.0905,
                              "fromValue": 1849
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2092
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2216
                            },
                            {
                              "a": 0.042,
                              "b": -8.3193,
                              "fromValue": 2340
                            },
                            {
                              "a": 0.0403,
                              "b": -4.1532,
                              "fromValue": 2459
                            },
                            {
                              "a": 0.0389,
                              "b": -0.5058,
                              "fromValue": 2583
                            },
                            {
                              "a": 0.045,
                              "b": -17.9279,
                              "fromValue": 2840
                            },
                            {
                              "a": 0.0398,
                              "b": -1.992,
                              "fromValue": 3062
                            },
                            {
                              "a": 0.0405,
                              "b": -4.1295,
                              "fromValue": 3313
                            },
                            {
                              "a": 0.0426,
                              "b": -11.4893,
                              "fromValue": 3560
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 3983
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 4095
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 0,
                              "y": 0
                            },
                            {
                              "x": 115,
                              "y": 10
                            },
                            {
                              "x": 470,
                              "y": 20
                            },
                            {
                              "x": 791,
                              "y": 30
                            },
                            {
                              "x": 1092,
                              "y": 40
                            },
                            {
                              "x": 1353,
                              "y": 50
                            },
                            {
                              "x": 1607,
                              "y": 60
                            },
                            {
                              "x": 1849,
                              "y": 70
                            },
                            {
                              "x": 2092,
                              "y": 80
                            },
                            {
                              "x": 2216,
                              "y": 85
                            },
                            {
                              "x": 2340,
                              "y": 90
                            },
                            {
                              "x": 2459,
                              "y": 95
                            },
                            {
                              "x": 2583,
                              "y": 100
                            },
                            {
                              "x": 2840,
                              "y": 110
                            },
                            {
                              "x": 3062,
                              "y": 120
                            },
                            {
                              "x": 3313,
                              "y": 130
                            },
                            {
                              "x": 3560,
                              "y": 140
                            },
                            {
                              "x": 3983,
                              "y": 158
                            },
                            {
                              "x": 4095,
                              "y": 165
                            }
                          ],
                          "max_valid": 4096,
                          "min_valid": 1,
                          "param_key": "dut_485_1",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "fuelsensor",
                          "type": "sensor_type",
                          "value": "Датчик топлива"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Зажигание",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0,
                              "b": 1,
                              "fromValue": 26500
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 26500,
                              "y": 1
                            }
                          ],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "ignition",
                          "type": "sensor_type",
                          "value": "Датчик зажигания"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Пробег",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "mileage_cur",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "mileage",
                          "type": "sensor_type",
                          "value": "Датчик пробега"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Напряжение [mV]",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "power",
                          "type": "sensor_type",
                          "value": "Датчик напряжения"
                        }
                      }
                    ]
                  },
                  "services": {
                    "type": "array",
                    "items": {},
                    "example": []
                  },
                  "terminal_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "navtelecom"
                      },
                      "type": {
                        "type": "string",
                        "example": "terminal_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Navtelecom"
                      }
                    }
                  },
                  "trailers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "date_from": {
                          "type": "string",
                          "example": "2022-10-03 00:00:00"
                        },
                        "date_to": {
                          "type": "string",
                          "example": "2022-10-04 00:00:00"
                        },
                        "trailer": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "trailer": {
                          "id": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "trailer": {
                          "id": "d0bc0903-702b-4d96-826a-e26860681356"
                        }
                      }
                    ]
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "special_equipment"
                      },
                      "type": {
                        "type": "string",
                        "example": "unit_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Спецтехника"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/units": {
                  "value": {
                    "custom_fields": [
                      {
                        "group": "cf_custom",
                        "key": "S-2551",
                        "name": "S-2551",
                        "sort": 0,
                        "value": "#31"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minparktime",
                        "name": "Мин. время стоянки (сек)",
                        "sort": 1,
                        "value": "600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minfilling",
                        "name": "Мин. объем заправки",
                        "sort": 1,
                        "value": "20"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_summerconsump",
                        "name": "Расход летом (л/100км.)",
                        "sort": 1,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "analyst",
                        "name": "Аналитик",
                        "sort": 1,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_mileagecoeff",
                        "name": "Коэф. пробега",
                        "sort": 2,
                        "value": "1.0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_msgignorestart",
                        "name": "Игнор-ть сообщ-я после начала движения",
                        "sort": 2,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterconsump",
                        "name": "Расход зимой (л/100км.)",
                        "sort": 2,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "installer",
                        "name": "Установщик",
                        "sort": 2,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minmovespeed",
                        "name": "Мин. скорость движ-я (км/ч)",
                        "sort": 3,
                        "value": "1"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minstaytheft",
                        "name": "Мин. время остановки для опр-ия слива",
                        "sort": 3,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingsummer",
                        "name": "На холостом ходу летом (л./час.)",
                        "sort": 3,
                        "value": "0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minitheft",
                        "name": "Мин. объем слива",
                        "sort": 4,
                        "value": "25"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_date",
                        "name": "Дата установки",
                        "sort": 4,
                        "value": "16.07.2019"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingwinter",
                        "name": "На холостом ходу зимой (л./час.)",
                        "sort": 4,
                        "value": "0"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintripdist",
                        "name": "Мин. расст-ие поездки (м)",
                        "sort": 4,
                        "value": "100"
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_maxintervalmsg",
                        "name": "Макс. интервал между сообщ-ми (сек)",
                        "sort": 5,
                        "value": "3600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_coeffunderload",
                        "name": "Коэф. при движении под нагрузкой",
                        "sort": 5,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_place",
                        "name": "Место установки в ТС",
                        "sort": 5,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_maxdistancemsg",
                        "name": "Макс. расст-ие между сообщ-ми (м)",
                        "sort": 6,
                        "value": "1000"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterfrom",
                        "name": "Первый месяц зимы (январь-1)",
                        "sort": 6,
                        "value": "11"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number",
                        "name": "Серийный номер терминала",
                        "sort": 6,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintriptime",
                        "name": "Мин. время поездки (сек)",
                        "sort": 7,
                        "value": "300"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterto",
                        "name": "Последний месяц зимы (январь-1)",
                        "sort": 7,
                        "value": "3"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut",
                        "name": "Серийный номер ДУТ",
                        "sort": 7,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_price",
                        "name": "Стоимость (1 л.)",
                        "sort": 8,
                        "value": "45"
                      },
                      {
                        "group": "cf_trips",
                        "key": "key_tripdetector_movedetect",
                        "name": "Опр-ие движ-я",
                        "sort": 8,
                        "value": "speedkph"
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut_seal_serial_number",
                        "name": "Серийный номер пломбы ДУТ",
                        "sort": 8,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mileagedetect",
                        "name": "Определение пробега",
                        "sort": 9,
                        "value": "mileage_GPS"
                      },
                      {
                        "group": "cf_etc",
                        "key": "license_plate_number",
                        "name": "Гос номер",
                        "sort": 9,
                        "value": ""
                      },
                      {
                        "group": "cf_motohours",
                        "key": "key_motohourdetector",
                        "name": "Определение моточасов",
                        "sort": 10,
                        "value": "ignition"
                      },
                      {
                        "group": "cf_etc",
                        "key": "hours_rate",
                        "name": "Норма часов в день",
                        "sort": 10,
                        "value": "8"
                      },
                      {
                        "group": "cf_etc",
                        "key": "block_date",
                        "name": "Дата блокировки(yyyy-MM-dd)",
                        "sort": 11,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "kp",
                        "name": "КП",
                        "sort": 12,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut",
                        "name": "ДУТ",
                        "sort": 13,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "second_sim",
                        "name": "Вторая sim",
                        "sort": 14,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_1",
                        "name": "Серийный номер ДУТ 1",
                        "sort": 15,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_2",
                        "name": "Серийный номер ДУТ 2",
                        "sort": 16,
                        "value": ""
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagekey",
                        "name": "translate.custom_fields.name.counters_mileagekey",
                        "sort": 1000,
                        "value": "gps_mileage"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagecurr",
                        "name": "translate.custom_fields.name.counters_mileagecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileageauto",
                        "name": "translate.custom_fields.name.counters_mileageauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_engienecurr",
                        "name": "translate.custom_fields.name.counters_engienecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprscurr",
                        "name": "translate.custom_fields.name.counters_gprscurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprsauto",
                        "name": "translate.custom_fields.name.counters_gprsauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_speedlimit",
                        "name": "translate.custom_fields.name.advanced_speedlimit",
                        "sort": 1000,
                        "value": "130"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_urbspeedlimit",
                        "name": "translate.custom_fields.name.advanced_urbspeedlimit",
                        "sort": 1000,
                        "value": "60"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_dailyengine",
                        "name": "translate.custom_fields.name.advanced_dailyengine",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_movedetectkey",
                        "name": "translate.custom_fields.name.tripdetector_movedetectkey",
                        "sort": 1000,
                        "value": "speed"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_gpscorrect",
                        "name": "translate.custom_fields.name.tripdetector_gpscorrect",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_minsatellites",
                        "name": "translate.custom_fields.name.tripdetector_minsatellites",
                        "sort": 1000,
                        "value": "3"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_mintipdist",
                        "name": "translate.custom_fields.name.tripdetector_mintipdist",
                        "sort": 1000,
                        "value": "100"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_fillingstop",
                        "name": "translate.custom_fields.name.fuel_fillings_fillingstop",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_ignorefiltration",
                        "name": "translate.custom_fields.name.fuel_fillings_ignorefiltration",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenameslevel",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenameslevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenamesconsum",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenamesconsum",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_timelevel",
                        "name": "translate.custom_fields.name.fuel_sensors_timelevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_filtervalues",
                        "name": "translate.custom_fields.name.fuel_sensors_filtervalues",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_idling",
                        "name": "translate.custom_fields.name.fuel_math_idling",
                        "sort": 1000,
                        "value": "2"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_urbcycle",
                        "name": "translate.custom_fields.name.fuel_math_urbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_suburbcycle",
                        "name": "translate.custom_fields.name.fuel_math_suburbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_levelsensors",
                        "name": "translate.custom_fields.name.fuel_level_levelsensors",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_repivalid",
                        "name": "translate.custom_fields.name.fuel_level_repivalid",
                        "sort": 1000,
                        "value": "true"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_impulsefuel",
                        "name": "translate.custom_fields.name.fuel_level_impulsefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_maximpulse",
                        "name": "translate.custom_fields.name.fuel_level_maximpulse",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_skipfirstzero",
                        "name": "translate.custom_fields.name.fuel_level_skipfirstzero",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_absolutefuel",
                        "name": "translate.custom_fields.name.fuel_level_absolutefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_instantfuel",
                        "name": "translate.custom_fields.name.fuel_level_instantfuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_diagnostic",
                        "key": "battery_charge_level_diagnostic",
                        "name": "translate.custom_fields.name.battery_charge_level_diagnostic",
                        "sort": 1,
                        "value": "diagnostic_ten_min"
                      }
                    ],
                    "drivers": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      }
                    ],
                    "icon": {
                      "key": "excavator_green",
                      "type": "unit_icon",
                      "value": "Иконка"
                    },
                    "imei": "12345",
                    "name": "КамАЗ 5490",
                    "phonenumber": "+79990000005",
                    "phonenumber2": "+21312123231",
                    "sensors": [
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "ДУТ-1",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0.087,
                              "b": 0,
                              "fromValue": 0
                            },
                            {
                              "a": 0.0282,
                              "b": 6.7606,
                              "fromValue": 115
                            },
                            {
                              "a": 0.0312,
                              "b": 5.3583,
                              "fromValue": 470
                            },
                            {
                              "a": 0.0332,
                              "b": 3.7209,
                              "fromValue": 791
                            },
                            {
                              "a": 0.0383,
                              "b": -1.8391,
                              "fromValue": 1092
                            },
                            {
                              "a": 0.0394,
                              "b": -3.2677,
                              "fromValue": 1353
                            },
                            {
                              "a": 0.0413,
                              "b": -6.405,
                              "fromValue": 1607
                            },
                            {
                              "a": 0.0412,
                              "b": -6.0905,
                              "fromValue": 1849
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2092
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2216
                            },
                            {
                              "a": 0.042,
                              "b": -8.3193,
                              "fromValue": 2340
                            },
                            {
                              "a": 0.0403,
                              "b": -4.1532,
                              "fromValue": 2459
                            },
                            {
                              "a": 0.0389,
                              "b": -0.5058,
                              "fromValue": 2583
                            },
                            {
                              "a": 0.045,
                              "b": -17.9279,
                              "fromValue": 2840
                            },
                            {
                              "a": 0.0398,
                              "b": -1.992,
                              "fromValue": 3062
                            },
                            {
                              "a": 0.0405,
                              "b": -4.1295,
                              "fromValue": 3313
                            },
                            {
                              "a": 0.0426,
                              "b": -11.4893,
                              "fromValue": 3560
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 3983
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 4095
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 0,
                              "y": 0
                            },
                            {
                              "x": 115,
                              "y": 10
                            },
                            {
                              "x": 470,
                              "y": 20
                            },
                            {
                              "x": 791,
                              "y": 30
                            },
                            {
                              "x": 1092,
                              "y": 40
                            },
                            {
                              "x": 1353,
                              "y": 50
                            },
                            {
                              "x": 1607,
                              "y": 60
                            },
                            {
                              "x": 1849,
                              "y": 70
                            },
                            {
                              "x": 2092,
                              "y": 80
                            },
                            {
                              "x": 2216,
                              "y": 85
                            },
                            {
                              "x": 2340,
                              "y": 90
                            },
                            {
                              "x": 2459,
                              "y": 95
                            },
                            {
                              "x": 2583,
                              "y": 100
                            },
                            {
                              "x": 2840,
                              "y": 110
                            },
                            {
                              "x": 3062,
                              "y": 120
                            },
                            {
                              "x": 3313,
                              "y": 130
                            },
                            {
                              "x": 3560,
                              "y": 140
                            },
                            {
                              "x": 3983,
                              "y": 158
                            },
                            {
                              "x": 4095,
                              "y": 165
                            }
                          ],
                          "max_valid": 4096,
                          "min_valid": 1,
                          "param_key": "dut_485_1",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "fuelsensor",
                          "type": "sensor_type",
                          "value": "Датчик топлива"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Зажигание",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0,
                              "b": 1,
                              "fromValue": 26500
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 26500,
                              "y": 1
                            }
                          ],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "ignition",
                          "type": "sensor_type",
                          "value": "Датчик зажигания"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Пробег",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "mileage_cur",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "mileage",
                          "type": "sensor_type",
                          "value": "Датчик пробега"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Напряжение [mV]",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "power",
                          "type": "sensor_type",
                          "value": "Датчик напряжения"
                        }
                      }
                    ],
                    "services": [],
                    "terminal_type": {
                      "key": "navtelecom",
                      "type": "terminal_type",
                      "value": "Navtelecom"
                    },
                    "trailers": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "trailer": {
                          "id": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "trailer": {
                          "id": "d0bc0903-702b-4d96-826a-e26860681356"
                        }
                      }
                    ],
                    "type": {
                      "key": "special_equipment",
                      "type": "unit_type",
                      "value": "Спецтехника"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units?ids=ids",
        "description": "**Планирование удаления объектов**\n\n---\n\nПланирование удаления нескольких объектов, в ids указать список идентификаторов удаляемых объектов.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**  \nDELETE /units?ids=eece8fbc-0bad-4a2d-ac24-62573860dda0,fd848416-bf81-4a92-9c01-922b2da4dd5a\n\n---\n\n**Пример ответа:**\n\nВ случае успеха - ответ '200', в теле ответа ID задачи удаления, с помощью которого можно отменить удаление.  \nВ случае ошибки - ответ 422, в теле текст ошибки.\n\n```\n{\n    \"id\": \"ace239ee-b7ab-42ee-9d57-d749a23987c6\"\n}\n\n ```",
        "operationId": "unitsIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "30d19f34-2f60-406c-897f-2083ba44e993"
                    },
                    "example": [
                      "30d19f34-2f60-406c-897f-2083ba44e993"
                    ]
                  }
                }
              },
              "examples": {
                "/units": {
                  "value": {
                    "ids": [
                      "30d19f34-2f60-406c-897f-2083ba44e993"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/units/{unit_id}": {
      "put": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/:unit_id",
        "description": "**Обновление объекта**\n\n---\n\nДерево объекта должно быть полным (с обновленными полями). Поля, которые будут отсутствовать в запросе, затрутся на null.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\nТот же, что и при [GET /units](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#8d9df07b-752a-4b59-ac91-219b25539c4e) - возвращает обновленное дерево объекта.",
        "operationId": "unitsUnitId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "custom_fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "group": {
                          "type": "string",
                          "example": "cf_custom"
                        },
                        "key": {
                          "type": "string",
                          "example": "S-2551"
                        },
                        "name": {
                          "type": "string",
                          "example": "S-2551"
                        },
                        "show_in_monitoring": {
                          "type": "boolean",
                          "example": false
                        },
                        "sort": {
                          "type": "number",
                          "example": 0
                        },
                        "value": {
                          "type": "string",
                          "example": "#31"
                        }
                      }
                    },
                    "example": [
                      {
                        "group": "cf_custom",
                        "key": "S-2551",
                        "name": "S-2551",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "#31"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_mileagekey",
                        "name": "translate.custom_fields.name.counters_mileagekey",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "gps_mileage"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_mileagecurr",
                        "name": "translate.custom_fields.name.counters_mileagecurr",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_mileageauto",
                        "name": "translate.custom_fields.name.counters_mileageauto",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_engienecurr",
                        "name": "translate.custom_fields.name.counters_engienecurr",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_gprscurr",
                        "name": "translate.custom_fields.name.counters_gprscurr",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_gprsauto",
                        "name": "translate.custom_fields.name.counters_gprsauto",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "advanced_speedlimit",
                        "name": "translate.custom_fields.name.advanced_speedlimit",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "130"
                      },
                      {
                        "group": "cf_custom",
                        "key": "advanced_urbspeedlimit",
                        "name": "translate.custom_fields.name.advanced_urbspeedlimit",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "60"
                      },
                      {
                        "group": "cf_custom",
                        "key": "advanced_dailyengine",
                        "name": "translate.custom_fields.name.advanced_dailyengine",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_movedetectkey",
                        "name": "translate.custom_fields.name.tripdetector_movedetectkey",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "speed"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_gpscorrect",
                        "name": "translate.custom_fields.name.tripdetector_gpscorrect",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_minsatellites",
                        "name": "translate.custom_fields.name.tripdetector_minsatellites",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "3"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_mintipdist",
                        "name": "translate.custom_fields.name.tripdetector_mintipdist",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "100"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_fillings_fillingstop",
                        "name": "translate.custom_fields.name.fuel_fillings_fillingstop",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_fillings_ignorefiltration",
                        "name": "translate.custom_fields.name.fuel_fillings_ignorefiltration",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_mergenameslevel",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenameslevel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_mergenamesconsum",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenamesconsum",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_timelevel",
                        "name": "translate.custom_fields.name.fuel_sensors_timelevel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_filtervalues",
                        "name": "translate.custom_fields.name.fuel_sensors_filtervalues",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_math_idling",
                        "name": "translate.custom_fields.name.fuel_math_idling",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "2"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_math_urbcycle",
                        "name": "translate.custom_fields.name.fuel_math_urbcycle",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_math_suburbcycle",
                        "name": "translate.custom_fields.name.fuel_math_suburbcycle",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_levelsensors",
                        "name": "translate.custom_fields.name.fuel_level_levelsensors",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_repivalid",
                        "name": "translate.custom_fields.name.fuel_level_repivalid",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "true"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_impulsefuel",
                        "name": "translate.custom_fields.name.fuel_level_impulsefuel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_maximpulse",
                        "name": "translate.custom_fields.name.fuel_level_maximpulse",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_skipfirstzero",
                        "name": "translate.custom_fields.name.fuel_level_skipfirstzero",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_absolutefuel",
                        "name": "translate.custom_fields.name.fuel_level_absolutefuel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_instantfuel",
                        "name": "translate.custom_fields.name.fuel_level_instantfuel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minparktime",
                        "name": "Мин. время стоянки (сек)",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": "600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minfilling",
                        "name": "Мин. объем заправки",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": "20"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_summerconsump",
                        "name": "Расход летом (л/100км.)",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "analyst",
                        "name": "Аналитик",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_mileagecoeff",
                        "name": "Коэф. пробега",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": "1.0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_msgignorestart",
                        "name": "Игнор-ть сообщ-я после начала движения",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterconsump",
                        "name": "Расход зимой (л/100км.)",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "installer",
                        "name": "Установщик",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minmovespeed",
                        "name": "Мин. скорость движ-я (км/ч)",
                        "show_in_monitoring": false,
                        "sort": 3,
                        "value": "1"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minstaytheft",
                        "name": "Мин. время остановки для опр-ия слива",
                        "show_in_monitoring": false,
                        "sort": 3,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingsummer",
                        "name": "На холостом ходу летом (л./час.)",
                        "show_in_monitoring": false,
                        "sort": 3,
                        "value": "0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minitheft",
                        "name": "Мин. объем слива",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "25"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_date",
                        "name": "Дата установки(формат год-месяц-день, например 2019-03-07)",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "16.07.2019"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingwinter",
                        "name": "На холостом ходу зимой (л./час.)",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "0"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintripdist",
                        "name": "Мин. расст-ие поездки (м)",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "100"
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_maxintervalmsg",
                        "name": "Макс. интервал между сообщ-ми (сек)",
                        "show_in_monitoring": false,
                        "sort": 5,
                        "value": "3600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_coeffunderload",
                        "name": "Коэф. при движении под нагрузкой",
                        "show_in_monitoring": false,
                        "sort": 5,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_place",
                        "name": "Место установки в ТС",
                        "show_in_monitoring": false,
                        "sort": 5,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_maxdistancemsg",
                        "name": "Макс. расст-ие между сообщ-ми (м)",
                        "show_in_monitoring": false,
                        "sort": 6,
                        "value": "1000"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterfrom",
                        "name": "Первый месяц зимы (январь-1)",
                        "show_in_monitoring": false,
                        "sort": 6,
                        "value": "11"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number",
                        "name": "Серийный номер терминала",
                        "show_in_monitoring": false,
                        "sort": 6,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintriptime",
                        "name": "Мин. время поездки (сек)",
                        "show_in_monitoring": false,
                        "sort": 7,
                        "value": "300"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterto",
                        "name": "Последний месяц зимы (январь-1)",
                        "show_in_monitoring": false,
                        "sort": 7,
                        "value": "3"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut",
                        "name": "Серийный номер ДУТ",
                        "show_in_monitoring": false,
                        "sort": 7,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_price",
                        "name": "Стоимость (1 л.)",
                        "show_in_monitoring": false,
                        "sort": 8,
                        "value": "45"
                      },
                      {
                        "group": "cf_trips",
                        "key": "key_tripdetector_movedetect",
                        "name": "Опр-ие движ-я",
                        "show_in_monitoring": false,
                        "sort": 8,
                        "value": "speedkph"
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut_seal_serial_number",
                        "name": "Серийный номер пломбы ДУТ",
                        "show_in_monitoring": false,
                        "sort": 8,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mileagedetect",
                        "name": "Определение пробега",
                        "show_in_monitoring": false,
                        "sort": 9,
                        "value": "mileage_GPS"
                      },
                      {
                        "group": "cf_etc",
                        "key": "license_plate_number",
                        "name": "Гос номер",
                        "show_in_monitoring": false,
                        "sort": 9,
                        "value": ""
                      },
                      {
                        "group": "cf_motohours",
                        "key": "key_motohourdetector",
                        "name": "Определение моточасов",
                        "show_in_monitoring": false,
                        "sort": 10,
                        "value": "ignition"
                      },
                      {
                        "group": "cf_etc",
                        "key": "hours_rate",
                        "name": "Норма часов в день",
                        "show_in_monitoring": false,
                        "sort": 10,
                        "value": "8"
                      },
                      {
                        "group": "cf_etc",
                        "key": "block_date",
                        "name": "Дата блокировки(формат год-месяц-день, например 2019-03-07)",
                        "show_in_monitoring": false,
                        "sort": 11,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "kp",
                        "name": "КП",
                        "show_in_monitoring": false,
                        "sort": 12,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut",
                        "name": "ДУТ",
                        "show_in_monitoring": false,
                        "sort": 13,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "second_sim",
                        "name": "Вторая sim",
                        "show_in_monitoring": false,
                        "sort": 14,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_1",
                        "name": "Серийный номер ДУТ 1",
                        "show_in_monitoring": false,
                        "sort": 15,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_2",
                        "name": "Серийный номер ДУТ 2",
                        "show_in_monitoring": false,
                        "sort": 16,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "brand_name",
                        "name": "Марка машины",
                        "show_in_monitoring": false,
                        "sort": 17,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_type",
                        "name": "Вид топлива (бенз., д/т)",
                        "show_in_monitoring": false,
                        "sort": 18,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_mark",
                        "name": "Марка горючего",
                        "show_in_monitoring": false,
                        "sort": 19,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "brand_code",
                        "name": "Код марки",
                        "show_in_monitoring": false,
                        "sort": 20,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "video_device_name",
                        "name": "Видео устройство",
                        "show_in_monitoring": false,
                        "sort": 21,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "video_device_id",
                        "name": "ID-видео устройства",
                        "show_in_monitoring": false,
                        "sort": 22,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "video_cameras",
                        "name": "Камеры",
                        "show_in_monitoring": false,
                        "sort": 23,
                        "value": ""
                      }
                    ]
                  },
                  "drivers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "custom_fields": {
                          "type": "array",
                          "items": {},
                          "example": []
                        },
                        "date_from": {
                          "type": "string",
                          "example": "2022-10-03 03:00:00"
                        },
                        "date_to": {
                          "type": "string",
                          "example": "2022-10-04 03:00:00"
                        },
                        "id": {
                          "type": "string",
                          "example": "1e5e4b2e-8fc6-405f-bed4-db5742327d4b"
                        },
                        "unit": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "1058bb08-618d-493e-95bd-862dfe36989b"
                            },
                            "name": {
                              "type": "string",
                              "example": "КамАЗ 5490"
                            }
                          }
                        },
                        "user": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                            }
                          }
                        },
                        "user_id": {
                          "type": "string",
                          "example": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      }
                    },
                    "example": [
                      {
                        "custom_fields": [],
                        "date_from": "2022-10-03 03:00:00",
                        "date_to": "2022-10-04 03:00:00",
                        "id": "1e5e4b2e-8fc6-405f-bed4-db5742327d4b",
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b",
                          "name": "КамАЗ 5490"
                        },
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        },
                        "user_id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                      },
                      {
                        "custom_fields": [],
                        "date_from": "2022-10-05 03:00:00",
                        "date_to": "2022-10-10 03:00:00",
                        "id": "292a5e8d-970c-4dd5-97fb-c436f4767adb",
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b",
                          "name": "КамАЗ 5490"
                        },
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        },
                        "user_id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                      }
                    ]
                  },
                  "icon": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "excavator_green"
                      },
                      "type": {
                        "type": "string",
                        "example": "unit_icon"
                      },
                      "value": {
                        "type": "string",
                        "example": "Иконка"
                      }
                    }
                  },
                  "id": {
                    "type": "string",
                    "example": "1058bb08-618d-493e-95bd-862dfe36989b"
                  },
                  "imei": {
                    "type": "string",
                    "example": "12121212"
                  },
                  "name": {
                    "type": "string",
                    "example": "КамАЗ 5490"
                  },
                  "phonenumber": {
                    "type": "string",
                    "example": "+79990000006"
                  },
                  "phonenumber2": {
                    "type": "string",
                    "example": "+79990000007"
                  },
                  "sensors": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "formula": {
                          "type": "string",
                          "example": "S1"
                        },
                        "hide_in_reports": {
                          "type": "boolean",
                          "example": false
                        },
                        "id": {
                          "type": "string",
                          "example": "3e40dece-4d43-42f9-a997-16a8352e5e6a"
                        },
                        "invalid": {
                          "type": "boolean",
                          "example": false
                        },
                        "name": {
                          "type": "string",
                          "example": "ДУТ-1"
                        },
                        "param1": {
                          "type": "object",
                          "properties": {
                            "calibrationABlist": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "a": {
                                    "type": "number",
                                    "example": 0.087
                                  },
                                  "b": {
                                    "type": "number",
                                    "example": 0
                                  },
                                  "fromValue": {
                                    "type": "number",
                                    "example": 0
                                  }
                                }
                              },
                              "example": [
                                {
                                  "a": 0.087,
                                  "b": 0,
                                  "fromValue": 0
                                },
                                {
                                  "a": 0.0282,
                                  "b": 6.7606,
                                  "fromValue": 115
                                },
                                {
                                  "a": 0.0312,
                                  "b": 5.3583,
                                  "fromValue": 470
                                },
                                {
                                  "a": 0.0332,
                                  "b": 3.7209,
                                  "fromValue": 791
                                },
                                {
                                  "a": 0.0383,
                                  "b": -1.8391,
                                  "fromValue": 1092
                                },
                                {
                                  "a": 0.0394,
                                  "b": -3.2677,
                                  "fromValue": 1353
                                },
                                {
                                  "a": 0.0413,
                                  "b": -6.405,
                                  "fromValue": 1607
                                },
                                {
                                  "a": 0.0412,
                                  "b": -6.0905,
                                  "fromValue": 1849
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.3548,
                                  "fromValue": 2092
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.3548,
                                  "fromValue": 2216
                                },
                                {
                                  "a": 0.042,
                                  "b": -8.3193,
                                  "fromValue": 2340
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.1532,
                                  "fromValue": 2459
                                },
                                {
                                  "a": 0.0389,
                                  "b": -0.5058,
                                  "fromValue": 2583
                                },
                                {
                                  "a": 0.045,
                                  "b": -17.9279,
                                  "fromValue": 2840
                                },
                                {
                                  "a": 0.0398,
                                  "b": -1.992,
                                  "fromValue": 3062
                                },
                                {
                                  "a": 0.0405,
                                  "b": -4.1295,
                                  "fromValue": 3313
                                },
                                {
                                  "a": 0.0426,
                                  "b": -11.4893,
                                  "fromValue": 3560
                                },
                                {
                                  "a": 0.0625,
                                  "b": -90.9375,
                                  "fromValue": 3983
                                },
                                {
                                  "a": 0.0625,
                                  "b": -90.9375,
                                  "fromValue": 4095
                                }
                              ]
                            },
                            "calibrationXYlist": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "x": {
                                    "type": "number",
                                    "example": 0
                                  },
                                  "y": {
                                    "type": "number",
                                    "example": 0
                                  }
                                }
                              },
                              "example": [
                                {
                                  "x": 0,
                                  "y": 0
                                },
                                {
                                  "x": 115,
                                  "y": 10
                                },
                                {
                                  "x": 470,
                                  "y": 20
                                },
                                {
                                  "x": 791,
                                  "y": 30
                                },
                                {
                                  "x": 1092,
                                  "y": 40
                                },
                                {
                                  "x": 1353,
                                  "y": 50
                                },
                                {
                                  "x": 1607,
                                  "y": 60
                                },
                                {
                                  "x": 1849,
                                  "y": 70
                                },
                                {
                                  "x": 2092,
                                  "y": 80
                                },
                                {
                                  "x": 2216,
                                  "y": 85
                                },
                                {
                                  "x": 2340,
                                  "y": 90
                                },
                                {
                                  "x": 2459,
                                  "y": 95
                                },
                                {
                                  "x": 2583,
                                  "y": 100
                                },
                                {
                                  "x": 2840,
                                  "y": 110
                                },
                                {
                                  "x": 3062,
                                  "y": 120
                                },
                                {
                                  "x": 3313,
                                  "y": 130
                                },
                                {
                                  "x": 3560,
                                  "y": 140
                                },
                                {
                                  "x": 3983,
                                  "y": 158
                                },
                                {
                                  "x": 4095,
                                  "y": 165
                                }
                              ]
                            },
                            "max_valid": {
                              "type": "number",
                              "example": 4096
                            },
                            "min_valid": {
                              "type": "number",
                              "example": 1
                            },
                            "param_key": {
                              "type": "string",
                              "example": "dut_485_1"
                            },
                            "smoothing": {
                              "type": "number",
                              "example": 0
                            }
                          }
                        },
                        "param2": {
                          "type": "object",
                          "properties": {
                            "calibrationABlist": {
                              "type": "array",
                              "items": {},
                              "example": []
                            },
                            "calibrationXYlist": {
                              "type": "array",
                              "items": {},
                              "example": []
                            },
                            "param_key": {
                              "type": "string",
                              "example": "skif_text"
                            },
                            "smoothing": {
                              "type": "number",
                              "example": 0
                            }
                          }
                        },
                        "type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "fuelsensor"
                            },
                            "type": {
                              "type": "string",
                              "example": "sensor_type"
                            },
                            "value": {
                              "type": "string",
                              "example": "Датчик топлива"
                            }
                          }
                        },
                        "unit": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "1058bb08-618d-493e-95bd-862dfe36989b"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "3e40dece-4d43-42f9-a997-16a8352e5e6a",
                        "invalid": false,
                        "name": "ДУТ-1",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0.087,
                              "b": 0,
                              "fromValue": 0
                            },
                            {
                              "a": 0.0282,
                              "b": 6.7606,
                              "fromValue": 115
                            },
                            {
                              "a": 0.0312,
                              "b": 5.3583,
                              "fromValue": 470
                            },
                            {
                              "a": 0.0332,
                              "b": 3.7209,
                              "fromValue": 791
                            },
                            {
                              "a": 0.0383,
                              "b": -1.8391,
                              "fromValue": 1092
                            },
                            {
                              "a": 0.0394,
                              "b": -3.2677,
                              "fromValue": 1353
                            },
                            {
                              "a": 0.0413,
                              "b": -6.405,
                              "fromValue": 1607
                            },
                            {
                              "a": 0.0412,
                              "b": -6.0905,
                              "fromValue": 1849
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2092
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2216
                            },
                            {
                              "a": 0.042,
                              "b": -8.3193,
                              "fromValue": 2340
                            },
                            {
                              "a": 0.0403,
                              "b": -4.1532,
                              "fromValue": 2459
                            },
                            {
                              "a": 0.0389,
                              "b": -0.5058,
                              "fromValue": 2583
                            },
                            {
                              "a": 0.045,
                              "b": -17.9279,
                              "fromValue": 2840
                            },
                            {
                              "a": 0.0398,
                              "b": -1.992,
                              "fromValue": 3062
                            },
                            {
                              "a": 0.0405,
                              "b": -4.1295,
                              "fromValue": 3313
                            },
                            {
                              "a": 0.0426,
                              "b": -11.4893,
                              "fromValue": 3560
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 3983
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 4095
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 0,
                              "y": 0
                            },
                            {
                              "x": 115,
                              "y": 10
                            },
                            {
                              "x": 470,
                              "y": 20
                            },
                            {
                              "x": 791,
                              "y": 30
                            },
                            {
                              "x": 1092,
                              "y": 40
                            },
                            {
                              "x": 1353,
                              "y": 50
                            },
                            {
                              "x": 1607,
                              "y": 60
                            },
                            {
                              "x": 1849,
                              "y": 70
                            },
                            {
                              "x": 2092,
                              "y": 80
                            },
                            {
                              "x": 2216,
                              "y": 85
                            },
                            {
                              "x": 2340,
                              "y": 90
                            },
                            {
                              "x": 2459,
                              "y": 95
                            },
                            {
                              "x": 2583,
                              "y": 100
                            },
                            {
                              "x": 2840,
                              "y": 110
                            },
                            {
                              "x": 3062,
                              "y": 120
                            },
                            {
                              "x": 3313,
                              "y": 130
                            },
                            {
                              "x": 3560,
                              "y": 140
                            },
                            {
                              "x": 3983,
                              "y": 158
                            },
                            {
                              "x": 4095,
                              "y": 165
                            }
                          ],
                          "max_valid": 4096,
                          "min_valid": 1,
                          "param_key": "dut_485_1",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "fuelsensor",
                          "type": "sensor_type",
                          "value": "Датчик топлива"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "cb49b8d4-b8c1-42f8-9764-4d09f7ebc7fc",
                        "invalid": false,
                        "name": "Зажигание",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0,
                              "b": 1,
                              "fromValue": 26500
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 26500,
                              "y": 1
                            }
                          ],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "ignition",
                          "type": "sensor_type",
                          "value": "Датчик зажигания"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "c73c964e-2f94-4568-8bde-ea577b00791f",
                        "invalid": false,
                        "name": "Пробег",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "mileage_cur",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "mileage",
                          "type": "sensor_type",
                          "value": "Датчик пробега"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "791d40fd-9d1e-463c-93a3-e602729c3ef1",
                        "invalid": false,
                        "name": "Напряжение [mV]",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "power",
                          "type": "sensor_type",
                          "value": "Датчик напряжения"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      }
                    ]
                  },
                  "services": {
                    "type": "array",
                    "items": {},
                    "example": []
                  },
                  "terminal_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "navtelecom"
                      },
                      "type": {
                        "type": "string",
                        "example": "terminal_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Navtelecom"
                      }
                    }
                  },
                  "trailers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "date_from": {
                          "type": "string",
                          "example": "2022-10-03 03:00:00"
                        },
                        "date_to": {
                          "type": "string",
                          "example": "2022-10-04 03:00:00"
                        },
                        "id": {
                          "type": "string",
                          "example": "4a6ed58d-ac43-4cfa-918a-8a9e2959e728"
                        },
                        "trailer": {
                          "type": "object",
                          "properties": {
                            "code": {
                              "type": "string",
                              "example": "tas"
                            },
                            "company_id": {
                              "type": "string",
                              "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                            },
                            "custom_fields": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "group": {
                                    "type": "string",
                                    "example": "custom"
                                  },
                                  "key": {
                                    "type": "string",
                                    "example": "1"
                                  },
                                  "name": {
                                    "type": "string",
                                    "example": "1"
                                  },
                                  "show_in_monitoring": {
                                    "type": "boolean",
                                    "example": false
                                  },
                                  "sort": {
                                    "type": "number",
                                    "example": 0
                                  },
                                  "value": {
                                    "type": "string",
                                    "example": "1"
                                  }
                                }
                              },
                              "example": [
                                {
                                  "group": "custom",
                                  "key": "1",
                                  "name": "1",
                                  "show_in_monitoring": false,
                                  "sort": 0,
                                  "value": "1"
                                }
                              ]
                            },
                            "description": {
                              "type": "string",
                              "example": "Сеялка"
                            },
                            "id": {
                              "type": "string",
                              "example": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6"
                            },
                            "name": {
                              "type": "string",
                              "example": "Прицеп123"
                            },
                            "width": {
                              "type": "number",
                              "example": 200
                            }
                          }
                        },
                        "unit": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "1058bb08-618d-493e-95bd-862dfe36989b"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "date_from": "2022-10-03 03:00:00",
                        "date_to": "2022-10-04 03:00:00",
                        "id": "4a6ed58d-ac43-4cfa-918a-8a9e2959e728",
                        "trailer": {
                          "code": "tas",
                          "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                          "custom_fields": [
                            {
                              "group": "custom",
                              "key": "1",
                              "name": "1",
                              "show_in_monitoring": false,
                              "sort": 0,
                              "value": "1"
                            }
                          ],
                          "description": "Сеялка",
                          "id": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6",
                          "name": "Прицеп123",
                          "width": 200
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "date_from": "2022-10-05 03:00:00",
                        "date_to": "2022-10-10 03:00:00",
                        "id": "b3b3731c-c1dd-40b4-9812-0658b4b4429b",
                        "trailer": {
                          "code": "1",
                          "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                          "custom_fields": [],
                          "description": "1111",
                          "id": "d0bc0903-702b-4d96-826a-e26860681356",
                          "name": "Прицеп567",
                          "width": 1
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      }
                    ]
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "special_equipment"
                      },
                      "type": {
                        "type": "string",
                        "example": "unit_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Спецтехника"
                      }
                    }
                  },
                  "units_groups_ids": {
                    "type": "string",
                    "example": "92223530-e77c-4b51-aeac-0534de0276a5"
                  },
                  "units_groups_names": {
                    "type": "string",
                    "example": "1"
                  }
                }
              },
              "examples": {
                "/units/:unit_id": {
                  "value": {
                    "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "custom_fields": [
                      {
                        "group": "cf_custom",
                        "key": "S-2551",
                        "name": "S-2551",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "#31"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_mileagekey",
                        "name": "translate.custom_fields.name.counters_mileagekey",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "gps_mileage"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_mileagecurr",
                        "name": "translate.custom_fields.name.counters_mileagecurr",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_mileageauto",
                        "name": "translate.custom_fields.name.counters_mileageauto",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_engienecurr",
                        "name": "translate.custom_fields.name.counters_engienecurr",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_gprscurr",
                        "name": "translate.custom_fields.name.counters_gprscurr",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "counters_gprsauto",
                        "name": "translate.custom_fields.name.counters_gprsauto",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "advanced_speedlimit",
                        "name": "translate.custom_fields.name.advanced_speedlimit",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "130"
                      },
                      {
                        "group": "cf_custom",
                        "key": "advanced_urbspeedlimit",
                        "name": "translate.custom_fields.name.advanced_urbspeedlimit",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "60"
                      },
                      {
                        "group": "cf_custom",
                        "key": "advanced_dailyengine",
                        "name": "translate.custom_fields.name.advanced_dailyengine",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_movedetectkey",
                        "name": "translate.custom_fields.name.tripdetector_movedetectkey",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "speed"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_gpscorrect",
                        "name": "translate.custom_fields.name.tripdetector_gpscorrect",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_minsatellites",
                        "name": "translate.custom_fields.name.tripdetector_minsatellites",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "3"
                      },
                      {
                        "group": "cf_custom",
                        "key": "tripdetector_mintipdist",
                        "name": "translate.custom_fields.name.tripdetector_mintipdist",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "100"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_fillings_fillingstop",
                        "name": "translate.custom_fields.name.fuel_fillings_fillingstop",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_fillings_ignorefiltration",
                        "name": "translate.custom_fields.name.fuel_fillings_ignorefiltration",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_mergenameslevel",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenameslevel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_mergenamesconsum",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenamesconsum",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_timelevel",
                        "name": "translate.custom_fields.name.fuel_sensors_timelevel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_sensors_filtervalues",
                        "name": "translate.custom_fields.name.fuel_sensors_filtervalues",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_math_idling",
                        "name": "translate.custom_fields.name.fuel_math_idling",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "2"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_math_urbcycle",
                        "name": "translate.custom_fields.name.fuel_math_urbcycle",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_math_suburbcycle",
                        "name": "translate.custom_fields.name.fuel_math_suburbcycle",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_levelsensors",
                        "name": "translate.custom_fields.name.fuel_level_levelsensors",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_repivalid",
                        "name": "translate.custom_fields.name.fuel_level_repivalid",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "true"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_impulsefuel",
                        "name": "translate.custom_fields.name.fuel_level_impulsefuel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_maximpulse",
                        "name": "translate.custom_fields.name.fuel_level_maximpulse",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "0"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_skipfirstzero",
                        "name": "translate.custom_fields.name.fuel_level_skipfirstzero",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_absolutefuel",
                        "name": "translate.custom_fields.name.fuel_level_absolutefuel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_custom",
                        "key": "fuel_level_instantfuel",
                        "name": "translate.custom_fields.name.fuel_level_instantfuel",
                        "show_in_monitoring": false,
                        "sort": 0,
                        "value": "false"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minparktime",
                        "name": "Мин. время стоянки (сек)",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": "600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minfilling",
                        "name": "Мин. объем заправки",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": "20"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_summerconsump",
                        "name": "Расход летом (л/100км.)",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "analyst",
                        "name": "Аналитик",
                        "show_in_monitoring": false,
                        "sort": 1,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_mileagecoeff",
                        "name": "Коэф. пробега",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": "1.0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_msgignorestart",
                        "name": "Игнор-ть сообщ-я после начала движения",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterconsump",
                        "name": "Расход зимой (л/100км.)",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "installer",
                        "name": "Установщик",
                        "show_in_monitoring": false,
                        "sort": 2,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minmovespeed",
                        "name": "Мин. скорость движ-я (км/ч)",
                        "show_in_monitoring": false,
                        "sort": 3,
                        "value": "1"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minstaytheft",
                        "name": "Мин. время остановки для опр-ия слива",
                        "show_in_monitoring": false,
                        "sort": 3,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingsummer",
                        "name": "На холостом ходу летом (л./час.)",
                        "show_in_monitoring": false,
                        "sort": 3,
                        "value": "0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minitheft",
                        "name": "Мин. объем слива",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "25"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_date",
                        "name": "Дата установки(формат год-месяц-день, например 2019-03-07)",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "16.07.2019"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingwinter",
                        "name": "На холостом ходу зимой (л./час.)",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "0"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintripdist",
                        "name": "Мин. расст-ие поездки (м)",
                        "show_in_monitoring": false,
                        "sort": 4,
                        "value": "100"
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_maxintervalmsg",
                        "name": "Макс. интервал между сообщ-ми (сек)",
                        "show_in_monitoring": false,
                        "sort": 5,
                        "value": "3600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_coeffunderload",
                        "name": "Коэф. при движении под нагрузкой",
                        "show_in_monitoring": false,
                        "sort": 5,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_place",
                        "name": "Место установки в ТС",
                        "show_in_monitoring": false,
                        "sort": 5,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_maxdistancemsg",
                        "name": "Макс. расст-ие между сообщ-ми (м)",
                        "show_in_monitoring": false,
                        "sort": 6,
                        "value": "1000"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterfrom",
                        "name": "Первый месяц зимы (январь-1)",
                        "show_in_monitoring": false,
                        "sort": 6,
                        "value": "11"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number",
                        "name": "Серийный номер терминала",
                        "show_in_monitoring": false,
                        "sort": 6,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintriptime",
                        "name": "Мин. время поездки (сек)",
                        "show_in_monitoring": false,
                        "sort": 7,
                        "value": "300"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterto",
                        "name": "Последний месяц зимы (январь-1)",
                        "show_in_monitoring": false,
                        "sort": 7,
                        "value": "3"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut",
                        "name": "Серийный номер ДУТ",
                        "show_in_monitoring": false,
                        "sort": 7,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_price",
                        "name": "Стоимость (1 л.)",
                        "show_in_monitoring": false,
                        "sort": 8,
                        "value": "45"
                      },
                      {
                        "group": "cf_trips",
                        "key": "key_tripdetector_movedetect",
                        "name": "Опр-ие движ-я",
                        "show_in_monitoring": false,
                        "sort": 8,
                        "value": "speedkph"
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut_seal_serial_number",
                        "name": "Серийный номер пломбы ДУТ",
                        "show_in_monitoring": false,
                        "sort": 8,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mileagedetect",
                        "name": "Определение пробега",
                        "show_in_monitoring": false,
                        "sort": 9,
                        "value": "mileage_GPS"
                      },
                      {
                        "group": "cf_etc",
                        "key": "license_plate_number",
                        "name": "Гос номер",
                        "show_in_monitoring": false,
                        "sort": 9,
                        "value": ""
                      },
                      {
                        "group": "cf_motohours",
                        "key": "key_motohourdetector",
                        "name": "Определение моточасов",
                        "show_in_monitoring": false,
                        "sort": 10,
                        "value": "ignition"
                      },
                      {
                        "group": "cf_etc",
                        "key": "hours_rate",
                        "name": "Норма часов в день",
                        "show_in_monitoring": false,
                        "sort": 10,
                        "value": "8"
                      },
                      {
                        "group": "cf_etc",
                        "key": "block_date",
                        "name": "Дата блокировки(формат год-месяц-день, например 2019-03-07)",
                        "show_in_monitoring": false,
                        "sort": 11,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "kp",
                        "name": "КП",
                        "show_in_monitoring": false,
                        "sort": 12,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut",
                        "name": "ДУТ",
                        "show_in_monitoring": false,
                        "sort": 13,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "second_sim",
                        "name": "Вторая sim",
                        "show_in_monitoring": false,
                        "sort": 14,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_1",
                        "name": "Серийный номер ДУТ 1",
                        "show_in_monitoring": false,
                        "sort": 15,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_2",
                        "name": "Серийный номер ДУТ 2",
                        "show_in_monitoring": false,
                        "sort": 16,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "brand_name",
                        "name": "Марка машины",
                        "show_in_monitoring": false,
                        "sort": 17,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_type",
                        "name": "Вид топлива (бенз., д/т)",
                        "show_in_monitoring": false,
                        "sort": 18,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_mark",
                        "name": "Марка горючего",
                        "show_in_monitoring": false,
                        "sort": 19,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "brand_code",
                        "name": "Код марки",
                        "show_in_monitoring": false,
                        "sort": 20,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "video_device_name",
                        "name": "Видео устройство",
                        "show_in_monitoring": false,
                        "sort": 21,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "video_device_id",
                        "name": "ID-видео устройства",
                        "show_in_monitoring": false,
                        "sort": 22,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "video_cameras",
                        "name": "Камеры",
                        "show_in_monitoring": false,
                        "sort": 23,
                        "value": ""
                      }
                    ],
                    "drivers": [
                      {
                        "custom_fields": [],
                        "date_from": "2022-10-03 03:00:00",
                        "date_to": "2022-10-04 03:00:00",
                        "id": "1e5e4b2e-8fc6-405f-bed4-db5742327d4b",
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b",
                          "name": "КамАЗ 5490"
                        },
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        },
                        "user_id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                      },
                      {
                        "custom_fields": [],
                        "date_from": "2022-10-05 03:00:00",
                        "date_to": "2022-10-10 03:00:00",
                        "id": "292a5e8d-970c-4dd5-97fb-c436f4767adb",
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b",
                          "name": "КамАЗ 5490"
                        },
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        },
                        "user_id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                      }
                    ],
                    "icon": {
                      "key": "excavator_green",
                      "type": "unit_icon",
                      "value": "Иконка"
                    },
                    "id": "1058bb08-618d-493e-95bd-862dfe36989b",
                    "imei": "12121212",
                    "name": "КамАЗ 5490",
                    "phonenumber": "+79990000006",
                    "phonenumber2": "+79990000007",
                    "sensors": [
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "3e40dece-4d43-42f9-a997-16a8352e5e6a",
                        "invalid": false,
                        "name": "ДУТ-1",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0.087,
                              "b": 0,
                              "fromValue": 0
                            },
                            {
                              "a": 0.0282,
                              "b": 6.7606,
                              "fromValue": 115
                            },
                            {
                              "a": 0.0312,
                              "b": 5.3583,
                              "fromValue": 470
                            },
                            {
                              "a": 0.0332,
                              "b": 3.7209,
                              "fromValue": 791
                            },
                            {
                              "a": 0.0383,
                              "b": -1.8391,
                              "fromValue": 1092
                            },
                            {
                              "a": 0.0394,
                              "b": -3.2677,
                              "fromValue": 1353
                            },
                            {
                              "a": 0.0413,
                              "b": -6.405,
                              "fromValue": 1607
                            },
                            {
                              "a": 0.0412,
                              "b": -6.0905,
                              "fromValue": 1849
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2092
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2216
                            },
                            {
                              "a": 0.042,
                              "b": -8.3193,
                              "fromValue": 2340
                            },
                            {
                              "a": 0.0403,
                              "b": -4.1532,
                              "fromValue": 2459
                            },
                            {
                              "a": 0.0389,
                              "b": -0.5058,
                              "fromValue": 2583
                            },
                            {
                              "a": 0.045,
                              "b": -17.9279,
                              "fromValue": 2840
                            },
                            {
                              "a": 0.0398,
                              "b": -1.992,
                              "fromValue": 3062
                            },
                            {
                              "a": 0.0405,
                              "b": -4.1295,
                              "fromValue": 3313
                            },
                            {
                              "a": 0.0426,
                              "b": -11.4893,
                              "fromValue": 3560
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 3983
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 4095
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 0,
                              "y": 0
                            },
                            {
                              "x": 115,
                              "y": 10
                            },
                            {
                              "x": 470,
                              "y": 20
                            },
                            {
                              "x": 791,
                              "y": 30
                            },
                            {
                              "x": 1092,
                              "y": 40
                            },
                            {
                              "x": 1353,
                              "y": 50
                            },
                            {
                              "x": 1607,
                              "y": 60
                            },
                            {
                              "x": 1849,
                              "y": 70
                            },
                            {
                              "x": 2092,
                              "y": 80
                            },
                            {
                              "x": 2216,
                              "y": 85
                            },
                            {
                              "x": 2340,
                              "y": 90
                            },
                            {
                              "x": 2459,
                              "y": 95
                            },
                            {
                              "x": 2583,
                              "y": 100
                            },
                            {
                              "x": 2840,
                              "y": 110
                            },
                            {
                              "x": 3062,
                              "y": 120
                            },
                            {
                              "x": 3313,
                              "y": 130
                            },
                            {
                              "x": 3560,
                              "y": 140
                            },
                            {
                              "x": 3983,
                              "y": 158
                            },
                            {
                              "x": 4095,
                              "y": 165
                            }
                          ],
                          "max_valid": 4096,
                          "min_valid": 1,
                          "param_key": "dut_485_1",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "fuelsensor",
                          "type": "sensor_type",
                          "value": "Датчик топлива"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "cb49b8d4-b8c1-42f8-9764-4d09f7ebc7fc",
                        "invalid": false,
                        "name": "Зажигание",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0,
                              "b": 1,
                              "fromValue": 26500
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 26500,
                              "y": 1
                            }
                          ],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "ignition",
                          "type": "sensor_type",
                          "value": "Датчик зажигания"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "c73c964e-2f94-4568-8bde-ea577b00791f",
                        "invalid": false,
                        "name": "Пробег",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "mileage_cur",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "mileage",
                          "type": "sensor_type",
                          "value": "Датчик пробега"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "id": "791d40fd-9d1e-463c-93a3-e602729c3ef1",
                        "invalid": false,
                        "name": "Напряжение [mV]",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "power",
                          "type": "sensor_type",
                          "value": "Датчик напряжения"
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      }
                    ],
                    "services": [],
                    "terminal_type": {
                      "key": "navtelecom",
                      "type": "terminal_type",
                      "value": "Navtelecom"
                    },
                    "trailers": [
                      {
                        "date_from": "2022-10-03 03:00:00",
                        "date_to": "2022-10-04 03:00:00",
                        "id": "4a6ed58d-ac43-4cfa-918a-8a9e2959e728",
                        "trailer": {
                          "code": "tas",
                          "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                          "custom_fields": [
                            {
                              "group": "custom",
                              "key": "1",
                              "name": "1",
                              "show_in_monitoring": false,
                              "sort": 0,
                              "value": "1"
                            }
                          ],
                          "description": "Сеялка",
                          "id": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6",
                          "name": "Прицеп123",
                          "width": 200
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      },
                      {
                        "date_from": "2022-10-05 03:00:00",
                        "date_to": "2022-10-10 03:00:00",
                        "id": "b3b3731c-c1dd-40b4-9812-0658b4b4429b",
                        "trailer": {
                          "code": "1",
                          "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                          "custom_fields": [],
                          "description": "1111",
                          "id": "d0bc0903-702b-4d96-826a-e26860681356",
                          "name": "Прицеп567",
                          "width": 1
                        },
                        "unit": {
                          "id": "1058bb08-618d-493e-95bd-862dfe36989b"
                        }
                      }
                    ],
                    "type": {
                      "key": "special_equipment",
                      "type": "unit_type",
                      "value": "Спецтехника"
                    },
                    "units_groups_ids": "92223530-e77c-4b51-aeac-0534de0276a5",
                    "units_groups_names": "1"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/:unit_id",
        "description": "**Удаление объекта**\n\n---\n\nФизически объект не удаляется из базы - флаг is_delete переводится в состояние true (необходимо для возможного восстановления объекта).\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\nВ случае успеха - ответ '200'",
        "operationId": "unitsUnitId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "unit_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        }
      ]
    },
    "/api_v1/units/{id}": {
      "patch": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/:id",
        "description": "**Обновление указанных полей объекта**\n\n---\n\nПока можно указать только custom_fields\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**  \nPATCH /units/836db03e-7475-4628-9323-0ca506e2061f\n\n```\n{\n    \"custom_fields\": [{\n            \"key\": \"video_device_name\",\n            \"value\": \"CARVIS\"\n        },\n        {\n            \"key\": \"brand_code\",\n            \"value\": \"123432\"\n        },\n        {\n            \"key\": \"tripdetector_mintriptime\",\n            \"value\": 70\n        }\n    ]\n}\n\n ```\n\nСписок все возможных custom_fields [GET /custom_fields](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#05ee6204-6755-48ec-aeac-ba53f1041e9e)\n\n---\n\n**Ответ:**\n\nТот же, что и при [GET /units](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#8d9df07b-752a-4b59-ac91-219b25539c4e) - возвращает обновленное дерево объекта.",
        "operationId": "unitsId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "custom_fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "video_device_name"
                        },
                        "value": {
                          "example": "CARVIS",
                          "anyOf": [
                            {
                              "type": "string",
                              "example": "CARVIS"
                            },
                            {
                              "type": "number",
                              "example": 70
                            }
                          ]
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "video_device_name",
                        "value": "CARVIS"
                      },
                      {
                        "key": "brand_code",
                        "value": "123432"
                      },
                      {
                        "key": "tripdetector_mintriptime",
                        "value": 70
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/units/:id": {
                  "value": {
                    "custom_fields": [
                      {
                        "key": "video_device_name",
                        "value": "CARVIS"
                      },
                      {
                        "key": "brand_code",
                        "value": "123432"
                      },
                      {
                        "key": "tripdetector_mintriptime",
                        "value": 70
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        }
      ]
    },
    "/api_v1/units/recovery/{unit_id}": {
      "put": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/recovery/:unit_id",
        "description": "**Восстанавливает ранее удаленный юнит**\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Ответ:**  \n200 OK",
        "operationId": "unitsRecoveryUnitId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "unit_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        }
      ]
    },
    "/api_v1/units/physical/{unit_id}": {
      "delete": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/physical/:unit_id",
        "description": "**Удаление объекта безвозвратно**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\nВ случае успеха - ответ '200'",
        "operationId": "unitsPhysicalUnitId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "SuperAdmin",
        "x-rate-limit": "10 req/min"
      },
      "parameters": [
        {
          "name": "unit_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        }
      ]
    },
    "/api_v1/units/services": {
      "get": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/services?ids=:ids",
        "description": "**Поиск сервисов по ID (через запятую)**\n\n---\n\n**Пример ответа:**\n\nВозвращает массив найденных сервисов. Если параметр unit_id пустой, значит данный сервис не привязан к какому-либо юниту.\n\n```\n    [\n         {\n            \"id\":\"e257e819-5d09-4da2-8ee4-9c072fef6de0\",\n            \"unit_id\":\"2bcd95c4-d520-4203-89fc-b0d3a76a7d6b\",\n            \"name\":\"ТО-1 (Замена масла)\",\n            \"description\":\"dumb service for test\",\n            \"isActiveKm\":true,\n            \"intervalKm\":10000,\n            \"lastKm\":45000,\n            \"isActiveDays\":true,\n            \"intervalDays\":300,\n            \"lastDays\":\"2019-06-03\",\n            \"activeKm\":true,\n            \"activeDays\":true\n         },\n         {...}\n    ]\n\n ```\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "unitsServicesIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/services",
        "description": "**Отдельное создание сервиса (без привязки к юниту)**\n\n---\n\nТо же самое, что и метод (POST /units/:unit_id/services), но без привязки к какому-то конкретному объекту.\n\n\nОтвет будет аналогичен методу выше (POST /units/:unit_id/services), но поле 'unit_id' будет пустым.\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "unitsServices",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/units/{unit_id}/services": {
      "get": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/:unit_id/services",
        "description": "**Поиск всех сервисов юнита**\n\n---\n\nВозвращает все привязанные к юниту сервисы.\n\nОтвет аналогичный [GET /units/services?ids=:ids](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#6dce08c8-6982-4b3e-b8fb-34fe9aca5790)\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "unitsUnitIdServices",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/:unit_id/services",
        "description": "**Отдельное создание сервиса (с привязкой к юниту)**\n\n---\n\nДанный вариант создания сервиса позволяет создать сервис для юнита через отдельный функционал и привязать их друг к другу, используя json форму только сервиса.\n\nТакже его можно создать при создании юнита ([POST /units](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#8d9df07b-752a-4b59-ac91-219b25539c4e)), заполнив в json'е юнита поле 'services', без указания id сервиса. Это позовлит создать и юнит и привязанный к нему сервис одномоментно.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\nПример создания сервиса для юнита с id = '4ca6ed64-3b58-493c-9ac9-862fe1a01f88' по УРЛу /units/4ca6ed64-3b58-493c-9ac9-862fe1a01f88/services:\n\n```\n{\n    \"name\": \"ТО-1 (Замена масла)\" // наименование сервиса,\n    \"description\": \"dumb service for test\" // описание,\n    \"isActiveKm\": \"true\" // активно или нет по км,\n    \"intervalKm\": \"10000\" // периодичность по км,\n    \"lastKm\": \"45000\" // последний раз по км,\n    \"isActiveDays\": \"true\" // активно или нет по дням,\n    \"intervaldays\": \"300\" // периодичность по дням,\n    \"lastdays\": \"2019-06-13\" // последний раз по дням (Формат yyyy-MM-dd)\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n   {\n      \"id\":\"2c705ae1-d99c-4be3-b564-8db5ac387caf\",\n      \"unit_id\":\"4ca6ed64-3b58-493c-9ac9-862fe1a01f88\",\n      \"name\":\"ТО-1 (Замена масла)\",\n      \"description\":\"dumb service for test\",\n      \"isActiveKm\":true,\n      \"intervalKm\":10000,\n      \"lastKm\":45000,\n      \"isActiveDays\":true,\n      \"intervalDays\":300,\n      \"lastDays\":\"2019-06-03\"\n   }\n\n ```",
        "operationId": "unitsUnitIdServices1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "description": {
                    "type": "string",
                    "example": "dumb service for test"
                  },
                  "intervalKm": {
                    "type": "string",
                    "example": "10000"
                  },
                  "intervaldays": {
                    "type": "string",
                    "example": "300"
                  },
                  "isActiveDays": {
                    "type": "string",
                    "example": "true"
                  },
                  "isActiveKm": {
                    "type": "string",
                    "example": "true"
                  },
                  "lastKm": {
                    "type": "string",
                    "example": "45000"
                  },
                  "lastdays": {
                    "type": "string",
                    "example": "2019-06-13"
                  },
                  "name": {
                    "type": "string",
                    "example": "ТО-1 (Замена масла)"
                  }
                }
              },
              "examples": {
                "/units/:unit_id/services": {
                  "value": {
                    "description": "dumb service for test",
                    "intervalKm": "10000",
                    "intervaldays": "300",
                    "isActiveDays": "true",
                    "isActiveKm": "true",
                    "lastKm": "45000",
                    "lastdays": "2019-06-13",
                    "name": "ТО-1 (Замена масла)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "unit_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        }
      ]
    },
    "/api_v1/units/sensors": {
      "get": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/sensors?ids=:ids",
        "description": "**Поиск датчиков по ID (через запятую)**\n\n---\n\nТо же самое что и в Сервисах [GET /units/services?ids=:ids](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#6dce08c8-6982-4b3e-b8fb-34fe9aca5790)\n\n---\n\n**Пример ответа:**\n\n```\n[{\n                \"id\": \"3c5b7072-abd5-4095-8be7-02d4b75751c0\",\n                \"unit_id\": \"72154648-1f0d-4acc-a74d-81c7926e4483\",\n                \"name\": \"Зажигание\",.\n                \"typekey\": \"ignition\",\n                \"param1\":{\n                    \"param_key\": \"dut_485_1\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 2.0, \"b\": 3.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 5.0 }]\n                },\n                \"param2\":{\n                    \"param_key\": \"dut_485_2\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 1.0, \"b\": 1.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 2.0 }]\n                },\n                \"formula\": \"S1\"\n        },\n        {...}\n        ]\n\n ```",
        "operationId": "unitsSensorsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/sensors",
        "description": "**Отдельное создание датчика (без привязки к объекту)**\n\n---\n\nАналогично [POST /units/services](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#3b7ade96-3cc0-4f96-b90b-2935f1ace7d1)\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "unitsSensors",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/units/{unit_id}/sensors": {
      "get": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/:unit_id/sensors",
        "description": "**Поиск всех датчиков объекта**\n\n---\n\nТо же самое, что и в Сервисах [GET /units/:unit_id/services](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#b114d108-11f0-433f-8e58-40d4ae7d6c58)\n\nОтвет аналогичный методу выше [GET /units/sensors?ids=:ids](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#862c1e9e-5ac4-4145-a9bf-66b5644fa8f8)\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "unitsUnitIdSensors",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/:unit_id/sensors",
        "description": "**Отдельное создание датчика (с привязкой к объекту)**\n\n---\n\nАналогично [POST /units/:unit_id/services](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#b1ffc9b0-1783-41ca-bf97-a6227919c280)\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"name\": \"Зажигание\" // Название датчика ,\n    \"type\": {\"key\":\"ignition\"} // тип датчика (из dictrionary, все ключи с типом \"sensor_type\"),\n    \"param1\":{ // Параметр №1 сенсора. Под примером доп.инфа.\n            \"param_key\": \"dut_485_1\", // ключ параметрa, должен быть в списке разрешенных ключей для конкретного терминала (/units/sensors/params)\n            \"calibrationABlist\": // Лист калибровок AB\n                [{\n                    \"fromValue\": 1.0, // нижняя граница\n                    \"a\": 2.0,    // коэффициент А\n                    \"b\": 3.0    // коэффициент B\n                }],\n            \"calibrationXYlist\": // Лист калибровок AB\n                [{\n                    \"x\": 1.0,    // коэффициент X\n                    \"y\": 5.0    // коэффициент Y\n                }]\n    },\n    \"param2\":{ // Параметр №2 сенсора. Под примером доп.инфа.\n            \"param_key\": \"dut_485_2\",\n            \"calibrationABlist\":\n                [{\n                    \"fromValue\": 1.0,\n                    \"a\": 1.0,\n                    \"b\": 1.0\n                }],\n            \"calibrationXYlist\":\n                [{\n                    \"x\": 1.0,\n                    \"y\": 2.0\n                }]\n    },\n    \"formula\": \"EXPR\" // формула связки параметра 1 и параметра 2.         Полный список возможных значений лежит в Dictionaries по ключу \"formula\".\n    \"expression\": \"$param + ${Пробег} / 100\"// выражения формулы, это поле нужно только в случае formula=EXPR и имеет следующие синтаксисы 1) обращение к значениям любого параметра из сырых данных -  #param333 (обращение к параметру param333)\n2) обращение к параметру текущего датчика - $param\nконстанты - 1000 (константа 1000)\n3) обращение к значению других датчиков ${Название датчика}\n4) арифметические операции - + * / ^(степень)\nскобки - ( или )\n}\n\n ```\n\nОписание param1, param2 сенсора: Данные параметры являются опциональными и если пользователь их не заполнил, то передавать их вообще не надо. Перед сохранением param1 и param2 происходит пересчет их внутренних калибровочных листов (калибровкиAB и КалибровкиXY). Лист КалибровокAB и лист калибровокXY у конкретного параметра взаимосвязаны и порождают друг друга по определенным формулам, т.е. из листа калибровок XY можно вычислить лист калибровок AB и наоборот.\n\nВ связи с этим РЕКОМЕНДУЕТСЯ перед тем, как сделать запрос, предварительно использовать метод [POST /units/sensors/recalc](https://documenter.getpostman.com/view/13147/RztmtVLV?version=latest#e6cca9ca-c162-4c2a-ae5b-a762aa3a6500) для пересчета этих листов и передавать в calibrationABlist и calibrationXYlist результат работы этого метода.\n\n---\n\n**Пример ответа:**\n\n```\n{\n                \"id\": \"3c5b7072-abd5-4095-8be7-02d4b75751c0\",\n                \"unit_id\": \"72154648-1f0d-4acc-a74d-81c7926e4483\",\n                \"name\": \"Зажигание\",.\n                \"typekey\": \"ignition\",\n                \"param1\":{\n                    \"param_key\": \"dut_485_1\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 2.0, \"b\": 3.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 5.0 }]\n                },\n                \"param2\":{\n                    \"param_key\": \"dut_485_2\",\n                    \"calibrationABlist\":\n                        [{ \"fromValue\": 1.0, \"a\": 1.0, \"b\": 1.0 }],\n                    \"calibrationXYlist\":\n                        [{ \"x\": 1.0, \"y\": 2.0 }]\n                },\n                \"formula\": \"S1\"\n        }\n\n ```",
        "operationId": "unitsUnitIdSensors1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "unit_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        }
      ]
    },
    "/api_v1/units/sensors/recalc": {
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/sensors/recalc",
        "description": "**Пересчет calibrationABlist или calibrationXYlist**\n\n---\n\nМетод для пересчета calibrationABlist или calibrationXYlist. ДАННЫЕ НИГДЕ НЕ СОХРАНЯЮТСЯ. Метод изолированный, создан как вспомогательный.  \nВ теле запроса передается массив, либо calibrationABlist, либо calibrationXYlist\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\nПример запроса с calibrationABlist:\n\n```\n\"[\n    {'fromValue':5.0, 'a': 3.0, 'b': 12.0},\n    {'fromValue':1.0, 'a': 0.0, 'b': 1.0},\n    {'fromValue':38.0, 'a': 1.0, 'b': 0.0}\n]\"\n\n ```\n\nПример запроса с calibrationXYlist:\n\n```\n\"[\n    {'x': 3.0, 'y': 12.0},\n    {'x': 0.0, 'y': 1.0},\n    {'x': 1.0, 'y': 0.0}\n]\"\n\n ```\n\n---\n\nОтвет всегда одного типа:\n\n```\n    \"{\n        \"calibrationABlist\":\n        [\n            {\"fromValue\":1.0,\"a\":0.0,\"b\":1.0},\n            {\"fromValue\":5.0,\"a\":3.0,\"b\":12.0},\n            {\"fromValue\":38.0,\"a\":1.0,\"b\":0.0}\n        ],\n        \"calibrationXYlist\":\n        [\n            {\"x\":1.0,\"y\":1.0},\n            {\"x\":5.0,\"y\":27.0},\n            {\"x\":38.0,\"y\":38.0}\n        ]\n    }\"\n\n ```\n\nлибо, если ошибка, со статусом 422.",
        "operationId": "unitsSensorsRecalc",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "number",
                      "example": 11
                    },
                    "y": {
                      "type": "number",
                      "example": 22
                    }
                  }
                },
                "example": [
                  {
                    "x": 11,
                    "y": 22
                  },
                  {
                    "x": 33,
                    "y": 5
                  },
                  {
                    "x": 55,
                    "y": 77
                  },
                  {
                    "x": 1011,
                    "y": 2022
                  }
                ]
              },
              "examples": {
                "/units/sensors/recalc": {
                  "value": [
                    {
                      "x": 11,
                      "y": 22
                    },
                    {
                      "x": 33,
                      "y": 5
                    },
                    {
                      "x": 55,
                      "y": 77
                    },
                    {
                      "x": 1011,
                      "y": 2022
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "5 req/min"
      }
    },
    "/api_v1/units/sensors/validate": {
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/sensors/validate?terminal_type=<terminal_type_key>",
        "description": "**Валидация списка датчиков**\n\n---\n\nВ запросе отправляется массив датчиков .  \nterminal_type - ключ терминала объекта.\n\nВ ответе, если всё успешно, возвращается статус `200` с пустым телом. В случае ошибки возвращается соответствующий код ошибки и её описание.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n[\n    {\n        \"name\": \"Sensor1\",\n        \"type\": {\n            \"key\": \"abs_motohours\",\n            \"type\": \"sensor_type\",\n            \"value\": \"Абсолютные моточасы\"\n        },\n        \"param1\": {\n            \"param_key\": \"acc_x\",\n            \"smoothing\": 0.0,\n            \"calibrationABlist\": [],\n            \"calibrationXYlist\": []\n        },\n        \"param2\": {\n            \"param_key\": \"\",\n            \"smoothing\": 0.0,\n            \"calibrationABlist\": [],\n            \"calibrationXYlist\": []\n        },\n        \"formula\": \"S1\",\n        \"hide_in_reports\": false,\n        \"invalid\": false\n    }, {\n        \"name\": \"Sensor2\",\n        \"type\": {\n            \"key\": \"abs_motohours\",\n            \"type\": \"sensor_type\",\n            \"value\": \"Абсолютные моточасы\"\n        },\n        \"param1\": {\n            \"param_key\": \"acc_y\",\n            \"smoothing\": 0.0,\n            \"calibrationABlist\": [],\n            \"calibrationXYlist\": []\n        },\n        \"param2\": {\n            \"param_key\": \"ewqeqwewqe\",\n            \"smoothing\": 0.0,\n            \"calibrationABlist\": [],\n            \"calibrationXYlist\": []\n        },\n        \"formula\": \"EXPR\",\n        \"expression\": \"$param1 + #fdsfdsf\",\n        \"hide_in_reports\": false\n    }\n]\n\n ```",
        "operationId": "unitsSensorsValidateTerminalTypeTerminalTypeKey",
        "parameters": [
          {
            "name": "terminal_type",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "expression": {
                      "type": "string",
                      "example": "$param1 + #fdsfdsf"
                    },
                    "formula": {
                      "type": "string",
                      "example": "S1"
                    },
                    "hide_in_reports": {
                      "type": "boolean",
                      "example": false
                    },
                    "invalid": {
                      "type": "boolean",
                      "example": false
                    },
                    "name": {
                      "type": "string",
                      "example": "Газель Next"
                    },
                    "param1": {
                      "type": "object",
                      "properties": {
                        "calibrationABlist": {
                          "type": "array",
                          "items": {},
                          "example": []
                        },
                        "calibrationXYlist": {
                          "type": "array",
                          "items": {},
                          "example": []
                        },
                        "param_key": {
                          "type": "string",
                          "example": "acc_x"
                        },
                        "smoothing": {
                          "type": "number",
                          "example": 0
                        }
                      }
                    },
                    "param2": {
                      "type": "object",
                      "properties": {
                        "calibrationABlist": {
                          "type": "array",
                          "items": {},
                          "example": []
                        },
                        "calibrationXYlist": {
                          "type": "array",
                          "items": {},
                          "example": []
                        },
                        "param_key": {
                          "type": "string",
                          "example": ""
                        },
                        "smoothing": {
                          "type": "number",
                          "example": 0
                        }
                      }
                    },
                    "type": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "abs_motohours"
                        },
                        "type": {
                          "type": "string",
                          "example": "sensor_type"
                        },
                        "value": {
                          "type": "string",
                          "example": "Абсолютные моточасы"
                        }
                      }
                    }
                  }
                },
                "example": [
                  {
                    "formula": "S1",
                    "hide_in_reports": false,
                    "invalid": false,
                    "name": "Газель Next",
                    "param1": {
                      "calibrationABlist": [],
                      "calibrationXYlist": [],
                      "param_key": "acc_x",
                      "smoothing": 0
                    },
                    "param2": {
                      "calibrationABlist": [],
                      "calibrationXYlist": [],
                      "param_key": "",
                      "smoothing": 0
                    },
                    "type": {
                      "key": "abs_motohours",
                      "type": "sensor_type",
                      "value": "Абсолютные моточасы"
                    }
                  },
                  {
                    "expression": "$param1 + #fdsfdsf",
                    "formula": "EXPR",
                    "hide_in_reports": false,
                    "name": "XXXX",
                    "param1": {
                      "calibrationABlist": [],
                      "calibrationXYlist": [],
                      "param_key": "acc_y",
                      "smoothing": 0
                    },
                    "param2": {
                      "calibrationABlist": [],
                      "calibrationXYlist": [],
                      "param_key": "ewqeqwewqe",
                      "smoothing": 0
                    },
                    "type": {
                      "key": "abs_motohours",
                      "type": "sensor_type",
                      "value": "Абсолютные моточасы"
                    }
                  }
                ]
              },
              "examples": {
                "/units/sensors/validate?terminal_type=<terminal_type_key>": {
                  "value": [
                    {
                      "formula": "S1",
                      "hide_in_reports": false,
                      "invalid": false,
                      "name": "Газель Next",
                      "param1": {
                        "calibrationABlist": [],
                        "calibrationXYlist": [],
                        "param_key": "acc_x",
                        "smoothing": 0
                      },
                      "param2": {
                        "calibrationABlist": [],
                        "calibrationXYlist": [],
                        "param_key": "",
                        "smoothing": 0
                      },
                      "type": {
                        "key": "abs_motohours",
                        "type": "sensor_type",
                        "value": "Абсолютные моточасы"
                      }
                    },
                    {
                      "expression": "$param1 + #fdsfdsf",
                      "formula": "EXPR",
                      "hide_in_reports": false,
                      "name": "XXXX",
                      "param1": {
                        "calibrationABlist": [],
                        "calibrationXYlist": [],
                        "param_key": "acc_y",
                        "smoothing": 0
                      },
                      "param2": {
                        "calibrationABlist": [],
                        "calibrationXYlist": [],
                        "param_key": "ewqeqwewqe",
                        "smoothing": 0
                      },
                      "type": {
                        "key": "abs_motohours",
                        "type": "sensor_type",
                        "value": "Абсолютные моточасы"
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/units/sensors/params": {
      "get": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/sensors/params",
        "description": "**Получение списка параметров датчика по каждой марке терминала**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Ответ:**\n\n```\n\"[{\n  \"navtelecom\":\"stamp, datepoint, imei_md5, latlon, bytes_out, bytes_in, speedkph, satellites, angle, altitude, pwr_ext, out_1_st\"\n },\n {\n  \"mtstracker\":\"stamp, datepoint, imei_md5, latlon, bytes_out, bytes_in, speedkph, satellites, angle, mileage_cur, navi_sensor_st_rec, navi_sensor_st_valid, acc_x, acc_y, acc_z, acc_max_minus,\n\"}]\"\n\n ```",
        "operationId": "unitsSensorsParams",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/point": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/point",
        "description": "**Метод возвращает информацию о конкретной точке объекта (аннотация точки).**\n\n---\n\nАннотация содержит в себе краткую информацию о точке:  \ndatepoint - время данной точки.  \nspeed - скорость в этой точке.  \n_marker_latlon - координата в формате \\[longitude, latitude\\].  \n<...далее идут все датчики юнита, со своими показаниями, пересчитанными по формуле. key - id датчика, name - имя...>\n\nПараметр \"from\" опциональный. При его отсутствии будет возвращена последняя точка юнита.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    'units': [ {'id': '9e86f2e9-3429-4674-945e-9519404451c0'} ], // берется только первый в массиве id, поэтому передавать несколько id не имеет смысла.\n    'from': '2020-01-06 13:26:42'\n}\n\n ```\n\n**Пример ответа:**\n\n```\n{\n    \"columns\": [\n        {\n            \"key\": \"datepoint\",\n            \"name\": \"datepoint\",\n            \"value\": \"2019-07-22 08:19:35\"\n        },\n        {\n            \"key\": \"speed\",\n            \"name\": \"speed\",\n            \"value\": 0\n        },\n        {\n            \"key\": \"_marker_latlon\",\n            \"name\": \"_marker_latlon\",\n            \"value\": [\n                63.534103,\n                53.1473\n            ]\n        },\n        {\n            \"key\": \"43eb314b-2eba-4f3f-aff8-2178a8d2431c\",\n            \"name\": \"Топливо\",\n            \"value\": 21505.1559\n        },\n        {\n            \"key\": \"7bbd2122-7078-4b5e-91b1-a1cfc84480cd\",\n            \"name\": \"Напряжение\",\n            \"value\": 24.05\n        },\n        {\n            \"key\": \"b4274fde-2f64-4144-9cfb-3a1223ba0ceb\",\n            \"name\": \"Зажигание\",\n            \"value\": 0.0\n        }\n    ]\n}\n\n ```",
        "operationId": "point",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2020-04-07 07:41:35"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "31e92253-1e70-4bb2-9b6f-385e9eed9ba4"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "31e92253-1e70-4bb2-9b6f-385e9eed9ba4"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/point": {
                  "value": {
                    "from": "2020-04-07 07:41:35",
                    "units": [
                      {
                        "id": "31e92253-1e70-4bb2-9b6f-385e9eed9ba4"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/units/list": {
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/list",
        "description": "**Получение объектов по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, возможные значения:  \n\\[\"name\", \"created\", \"type.key\", \"terminal_type.key\"\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - name (можно искать по неполному слову),  \n\"phonenumber\" - часть номера телефона,  \n\"imei\" - часть IMEI,  \n\"type.key\" - ключ тип объекта,  \n\"terminal_type.key\" - ключ тип терминала,  \n\"custom_fields\" - ,  \n\"sensors.name\" - название датчика,  \n\"sensors.param\" - параметр датчика,  \n\"sensors.type.key\" - ключ тип датчика,  \n\"events\" - события\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 объектов, отсортированные по возрастанию по имени\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"name\",\n    \"sortDesc\": \"false\",\n    \"fields\": [\"name\",  \"custom_fields.fuel_fillings_minfilling\", \"custom_fields.serial_number\"],\n    \"conditions\": [\n        {\n            \"field\": \"name\",\n            \"value\": \"НОДГП\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 150,\n    \"list\": [\n         {\n            \"id\": \"55e41fea-614d-4103-9a82-887d15f76013\",\n            \"name\": \"НОДГП-1 (НОДГП-1) Toyota Camry 110 АТ 03 Кокшетау\",\n            \"services\": [],\n            \"sensors\": [],\n            \"custom_fields\": [\n                {\n                    \"name\": \"Мин. объем заправки\",\n                    \"key\": \"fuel_fillings_minfilling\",\n                    \"value\": \"10\",\n                    \"group\": \"cf_fuel\",\n                    \"sort\": 1,\n                    \"show_in_monitoring\": false\n                },\n                {\n                    \"name\": \"Мин. время стоянки (сек)\",\n                    \"key\": \"tripdetector_minparktime\",\n                    \"value\": \"300\",\n                    \"group\": \"cf_trips\",\n                    \"sort\": 1,\n                    \"show_in_monitoring\": false\n                },\n                {\n                    \"name\": \"Мин. скорость движ-я (км/ч)\",\n                    \"key\": \"tripdetector_minmovespeed\",\n                    \"value\": \"3\",\n                    \"group\": \"cf_trips\",\n                    \"sort\": 3,\n                    \"show_in_monitoring\": false\n                },\n                {\n                    \"name\": \"Серийный номер терминала\",\n                    \"key\": \"serial_number\",\n                    \"value\": \"265100022886\",\n                    \"group\": \"cf_etc\",\n                    \"sort\": 6,\n                    \"show_in_monitoring\": false\n                }\n            ]\n        },\n        ...\n    ]\n}\n\n ```",
        "operationId": "unitsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "name"
                        },
                        "value": {
                          "type": "string",
                          "example": "НОДГП"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "name",
                        "value": "НОДГП"
                      }
                    ]
                  },
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "name"
                    },
                    "example": [
                      "name",
                      "custom_fields.fuel_fillings_minfilling",
                      "custom_fields.serial_number",
                      "custom_fields.tripdetector_minparktime",
                      "custom_fields.tripdetector_minmovespeed"
                    ]
                  }
                }
              },
              "examples": {
                "/units/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "name",
                        "value": "НОДГП"
                      }
                    ],
                    "fields": [
                      "name",
                      "custom_fields.fuel_fillings_minfilling",
                      "custom_fields.serial_number",
                      "custom_fields.tripdetector_minparktime",
                      "custom_fields.tripdetector_minmovespeed"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/units/validate": {
      "post": {
        "tags": [
          "Объекты"
        ],
        "summary": "/units/validate",
        "description": "**Валидация всех полей объекта**\n\n---\n\nAPI для валидации всех полей объекта, без сохранения. При этом ошибка может быть в разных полях\\\\сущностях объекта.  \nТело запроса, как при создании POST /units, и при обновлении PUT /units/:id\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "unitsValidate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "custom_fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "group": {
                          "type": "string",
                          "example": "cf_custom"
                        },
                        "key": {
                          "type": "string",
                          "example": "S-2551"
                        },
                        "name": {
                          "type": "string",
                          "example": "S-2551"
                        },
                        "sort": {
                          "type": "number",
                          "example": 0
                        },
                        "value": {
                          "type": "string",
                          "example": "#31"
                        }
                      }
                    },
                    "example": [
                      {
                        "group": "cf_custom",
                        "key": "S-2551",
                        "name": "S-2551",
                        "sort": 0,
                        "value": "#31"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minparktime",
                        "name": "Мин. время стоянки (сек)",
                        "sort": 1,
                        "value": "600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minfilling",
                        "name": "Мин. объем заправки",
                        "sort": 1,
                        "value": "20"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_summerconsump",
                        "name": "Расход летом (л/100км.)",
                        "sort": 1,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "analyst",
                        "name": "Аналитик",
                        "sort": 1,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_mileagecoeff",
                        "name": "Коэф. пробега",
                        "sort": 2,
                        "value": "1.0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_msgignorestart",
                        "name": "Игнор-ть сообщ-я после начала движения",
                        "sort": 2,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterconsump",
                        "name": "Расход зимой (л/100км.)",
                        "sort": 2,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "installer",
                        "name": "Установщик",
                        "sort": 2,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minmovespeed",
                        "name": "Мин. скорость движ-я (км/ч)",
                        "sort": 3,
                        "value": "1"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minstaytheft",
                        "name": "Мин. время остановки для опр-ия слива",
                        "sort": 3,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingsummer",
                        "name": "На холостом ходу летом (л./час.)",
                        "sort": 3,
                        "value": "0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minitheft",
                        "name": "Мин. объем слива",
                        "sort": 4,
                        "value": "25"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_date",
                        "name": "Дата установки",
                        "sort": 4,
                        "value": "16.07.2019"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingwinter",
                        "name": "На холостом ходу зимой (л./час.)",
                        "sort": 4,
                        "value": "0"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintripdist",
                        "name": "Мин. расст-ие поездки (м)",
                        "sort": 4,
                        "value": "100"
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_maxintervalmsg",
                        "name": "Макс. интервал между сообщ-ми (сек)",
                        "sort": 5,
                        "value": "3600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_coeffunderload",
                        "name": "Коэф. при движении под нагрузкой",
                        "sort": 5,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_place",
                        "name": "Место установки в ТС",
                        "sort": 5,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_maxdistancemsg",
                        "name": "Макс. расст-ие между сообщ-ми (м)",
                        "sort": 6,
                        "value": "1000"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterfrom",
                        "name": "Первый месяц зимы (январь-1)",
                        "sort": 6,
                        "value": "11"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number",
                        "name": "Серийный номер терминала",
                        "sort": 6,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintriptime",
                        "name": "Мин. время поездки (сек)",
                        "sort": 7,
                        "value": "300"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterto",
                        "name": "Последний месяц зимы (январь-1)",
                        "sort": 7,
                        "value": "3"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut",
                        "name": "Серийный номер ДУТ",
                        "sort": 7,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_price",
                        "name": "Стоимость (1 л.)",
                        "sort": 8,
                        "value": "45"
                      },
                      {
                        "group": "cf_trips",
                        "key": "key_tripdetector_movedetect",
                        "name": "Опр-ие движ-я",
                        "sort": 8,
                        "value": "speedkph"
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut_seal_serial_number",
                        "name": "Серийный номер пломбы ДУТ",
                        "sort": 8,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mileagedetect",
                        "name": "Определение пробега",
                        "sort": 9,
                        "value": "mileage_GPS"
                      },
                      {
                        "group": "cf_etc",
                        "key": "license_plate_number",
                        "name": "Гос номер",
                        "sort": 9,
                        "value": ""
                      },
                      {
                        "group": "cf_motohours",
                        "key": "key_motohourdetector",
                        "name": "Определение моточасов",
                        "sort": 10,
                        "value": "ignition"
                      },
                      {
                        "group": "cf_etc",
                        "key": "hours_rate",
                        "name": "Норма часов в день",
                        "sort": 10,
                        "value": "8"
                      },
                      {
                        "group": "cf_etc",
                        "key": "block_date",
                        "name": "Дата блокировки(yyyy-MM-dd)",
                        "sort": 11,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "kp",
                        "name": "КП",
                        "sort": 12,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut",
                        "name": "ДУТ",
                        "sort": 13,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "second_sim",
                        "name": "Вторая sim",
                        "sort": 14,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_1",
                        "name": "Серийный номер ДУТ 1",
                        "sort": 15,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_2",
                        "name": "Серийный номер ДУТ 2",
                        "sort": 16,
                        "value": ""
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagekey",
                        "name": "translate.custom_fields.name.counters_mileagekey",
                        "sort": 1000,
                        "value": "gps_mileage"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagecurr",
                        "name": "translate.custom_fields.name.counters_mileagecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileageauto",
                        "name": "translate.custom_fields.name.counters_mileageauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_engienecurr",
                        "name": "translate.custom_fields.name.counters_engienecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprscurr",
                        "name": "translate.custom_fields.name.counters_gprscurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprsauto",
                        "name": "translate.custom_fields.name.counters_gprsauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_speedlimit",
                        "name": "translate.custom_fields.name.advanced_speedlimit",
                        "sort": 1000,
                        "value": "130"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_urbspeedlimit",
                        "name": "translate.custom_fields.name.advanced_urbspeedlimit",
                        "sort": 1000,
                        "value": "60"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_dailyengine",
                        "name": "translate.custom_fields.name.advanced_dailyengine",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_movedetectkey",
                        "name": "translate.custom_fields.name.tripdetector_movedetectkey",
                        "sort": 1000,
                        "value": "speed"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_gpscorrect",
                        "name": "translate.custom_fields.name.tripdetector_gpscorrect",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_minsatellites",
                        "name": "translate.custom_fields.name.tripdetector_minsatellites",
                        "sort": 1000,
                        "value": "3"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_mintipdist",
                        "name": "translate.custom_fields.name.tripdetector_mintipdist",
                        "sort": 1000,
                        "value": "100"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_fillingstop",
                        "name": "translate.custom_fields.name.fuel_fillings_fillingstop",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_ignorefiltration",
                        "name": "translate.custom_fields.name.fuel_fillings_ignorefiltration",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenameslevel",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenameslevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenamesconsum",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenamesconsum",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_timelevel",
                        "name": "translate.custom_fields.name.fuel_sensors_timelevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_filtervalues",
                        "name": "translate.custom_fields.name.fuel_sensors_filtervalues",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_idling",
                        "name": "translate.custom_fields.name.fuel_math_idling",
                        "sort": 1000,
                        "value": "2"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_urbcycle",
                        "name": "translate.custom_fields.name.fuel_math_urbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_suburbcycle",
                        "name": "translate.custom_fields.name.fuel_math_suburbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_levelsensors",
                        "name": "translate.custom_fields.name.fuel_level_levelsensors",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_repivalid",
                        "name": "translate.custom_fields.name.fuel_level_repivalid",
                        "sort": 1000,
                        "value": "true"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_impulsefuel",
                        "name": "translate.custom_fields.name.fuel_level_impulsefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_maximpulse",
                        "name": "translate.custom_fields.name.fuel_level_maximpulse",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_skipfirstzero",
                        "name": "translate.custom_fields.name.fuel_level_skipfirstzero",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_absolutefuel",
                        "name": "translate.custom_fields.name.fuel_level_absolutefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_instantfuel",
                        "name": "translate.custom_fields.name.fuel_level_instantfuel",
                        "sort": 1000,
                        "value": "false"
                      }
                    ]
                  },
                  "drivers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "date_from": {
                          "type": "string",
                          "example": "2022-10-03 00:00:00"
                        },
                        "date_to": {
                          "type": "string",
                          "example": "2022-10-04 00:00:00"
                        },
                        "user": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      }
                    ]
                  },
                  "icon": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "excavator_green"
                      },
                      "type": {
                        "type": "string",
                        "example": "unit_icon"
                      },
                      "value": {
                        "type": "string",
                        "example": "Иконка"
                      }
                    }
                  },
                  "imei": {
                    "type": "string",
                    "example": "123412312"
                  },
                  "name": {
                    "type": "string",
                    "example": "КамАЗ 5490"
                  },
                  "phonenumber": {
                    "type": "string",
                    "example": "+79990000008"
                  },
                  "phonenumber2": {
                    "type": "string",
                    "example": "+34324343443"
                  },
                  "sensors": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "formula": {
                          "type": "string",
                          "example": "S1"
                        },
                        "hide_in_reports": {
                          "type": "boolean",
                          "example": false
                        },
                        "invalid": {
                          "type": "boolean",
                          "example": false
                        },
                        "name": {
                          "type": "string",
                          "example": "ДУТ-1"
                        },
                        "param1": {
                          "type": "object",
                          "properties": {
                            "calibrationABlist": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "a": {
                                    "type": "number",
                                    "example": 0.087
                                  },
                                  "b": {
                                    "type": "number",
                                    "example": 0
                                  },
                                  "fromValue": {
                                    "type": "number",
                                    "example": 0
                                  }
                                }
                              },
                              "example": [
                                {
                                  "a": 0.087,
                                  "b": 0,
                                  "fromValue": 0
                                },
                                {
                                  "a": 0.0282,
                                  "b": 6.7606,
                                  "fromValue": 115
                                },
                                {
                                  "a": 0.0312,
                                  "b": 5.3583,
                                  "fromValue": 470
                                },
                                {
                                  "a": 0.0332,
                                  "b": 3.7209,
                                  "fromValue": 791
                                },
                                {
                                  "a": 0.0383,
                                  "b": -1.8391,
                                  "fromValue": 1092
                                },
                                {
                                  "a": 0.0394,
                                  "b": -3.2677,
                                  "fromValue": 1353
                                },
                                {
                                  "a": 0.0413,
                                  "b": -6.405,
                                  "fromValue": 1607
                                },
                                {
                                  "a": 0.0412,
                                  "b": -6.0905,
                                  "fromValue": 1849
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.3548,
                                  "fromValue": 2092
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.3548,
                                  "fromValue": 2216
                                },
                                {
                                  "a": 0.042,
                                  "b": -8.3193,
                                  "fromValue": 2340
                                },
                                {
                                  "a": 0.0403,
                                  "b": -4.1532,
                                  "fromValue": 2459
                                },
                                {
                                  "a": 0.0389,
                                  "b": -0.5058,
                                  "fromValue": 2583
                                },
                                {
                                  "a": 0.045,
                                  "b": -17.9279,
                                  "fromValue": 2840
                                },
                                {
                                  "a": 0.0398,
                                  "b": -1.992,
                                  "fromValue": 3062
                                },
                                {
                                  "a": 0.0405,
                                  "b": -4.1295,
                                  "fromValue": 3313
                                },
                                {
                                  "a": 0.0426,
                                  "b": -11.4893,
                                  "fromValue": 3560
                                },
                                {
                                  "a": 0.0625,
                                  "b": -90.9375,
                                  "fromValue": 3983
                                },
                                {
                                  "a": 0.0625,
                                  "b": -90.9375,
                                  "fromValue": 4095
                                }
                              ]
                            },
                            "calibrationXYlist": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "x": {
                                    "type": "number",
                                    "example": 0
                                  },
                                  "y": {
                                    "type": "number",
                                    "example": 0
                                  }
                                }
                              },
                              "example": [
                                {
                                  "x": 0,
                                  "y": 0
                                },
                                {
                                  "x": 115,
                                  "y": 10
                                },
                                {
                                  "x": 470,
                                  "y": 20
                                },
                                {
                                  "x": 791,
                                  "y": 30
                                },
                                {
                                  "x": 1092,
                                  "y": 40
                                },
                                {
                                  "x": 1353,
                                  "y": 50
                                },
                                {
                                  "x": 1607,
                                  "y": 60
                                },
                                {
                                  "x": 1849,
                                  "y": 70
                                },
                                {
                                  "x": 2092,
                                  "y": 80
                                },
                                {
                                  "x": 2216,
                                  "y": 85
                                },
                                {
                                  "x": 2340,
                                  "y": 90
                                },
                                {
                                  "x": 2459,
                                  "y": 95
                                },
                                {
                                  "x": 2583,
                                  "y": 100
                                },
                                {
                                  "x": 2840,
                                  "y": 110
                                },
                                {
                                  "x": 3062,
                                  "y": 120
                                },
                                {
                                  "x": 3313,
                                  "y": 130
                                },
                                {
                                  "x": 3560,
                                  "y": 140
                                },
                                {
                                  "x": 3983,
                                  "y": 158
                                },
                                {
                                  "x": 4095,
                                  "y": 165
                                }
                              ]
                            },
                            "max_valid": {
                              "type": "number",
                              "example": 4096
                            },
                            "min_valid": {
                              "type": "number",
                              "example": 1
                            },
                            "param_key": {
                              "type": "string",
                              "example": "dut_485_1"
                            },
                            "smoothing": {
                              "type": "number",
                              "example": 0
                            }
                          }
                        },
                        "param2": {
                          "type": "object",
                          "properties": {
                            "calibrationABlist": {
                              "type": "array",
                              "items": {},
                              "example": []
                            },
                            "calibrationXYlist": {
                              "type": "array",
                              "items": {},
                              "example": []
                            },
                            "param_key": {
                              "type": "string",
                              "example": "skif_text"
                            },
                            "smoothing": {
                              "type": "number",
                              "example": 0
                            }
                          }
                        },
                        "type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "fuelsensor"
                            },
                            "type": {
                              "type": "string",
                              "example": "sensor_type"
                            },
                            "value": {
                              "type": "string",
                              "example": "Датчик топлива"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "ДУТ-1",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0.087,
                              "b": 0,
                              "fromValue": 0
                            },
                            {
                              "a": 0.0282,
                              "b": 6.7606,
                              "fromValue": 115
                            },
                            {
                              "a": 0.0312,
                              "b": 5.3583,
                              "fromValue": 470
                            },
                            {
                              "a": 0.0332,
                              "b": 3.7209,
                              "fromValue": 791
                            },
                            {
                              "a": 0.0383,
                              "b": -1.8391,
                              "fromValue": 1092
                            },
                            {
                              "a": 0.0394,
                              "b": -3.2677,
                              "fromValue": 1353
                            },
                            {
                              "a": 0.0413,
                              "b": -6.405,
                              "fromValue": 1607
                            },
                            {
                              "a": 0.0412,
                              "b": -6.0905,
                              "fromValue": 1849
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2092
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2216
                            },
                            {
                              "a": 0.042,
                              "b": -8.3193,
                              "fromValue": 2340
                            },
                            {
                              "a": 0.0403,
                              "b": -4.1532,
                              "fromValue": 2459
                            },
                            {
                              "a": 0.0389,
                              "b": -0.5058,
                              "fromValue": 2583
                            },
                            {
                              "a": 0.045,
                              "b": -17.9279,
                              "fromValue": 2840
                            },
                            {
                              "a": 0.0398,
                              "b": -1.992,
                              "fromValue": 3062
                            },
                            {
                              "a": 0.0405,
                              "b": -4.1295,
                              "fromValue": 3313
                            },
                            {
                              "a": 0.0426,
                              "b": -11.4893,
                              "fromValue": 3560
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 3983
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 4095
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 0,
                              "y": 0
                            },
                            {
                              "x": 115,
                              "y": 10
                            },
                            {
                              "x": 470,
                              "y": 20
                            },
                            {
                              "x": 791,
                              "y": 30
                            },
                            {
                              "x": 1092,
                              "y": 40
                            },
                            {
                              "x": 1353,
                              "y": 50
                            },
                            {
                              "x": 1607,
                              "y": 60
                            },
                            {
                              "x": 1849,
                              "y": 70
                            },
                            {
                              "x": 2092,
                              "y": 80
                            },
                            {
                              "x": 2216,
                              "y": 85
                            },
                            {
                              "x": 2340,
                              "y": 90
                            },
                            {
                              "x": 2459,
                              "y": 95
                            },
                            {
                              "x": 2583,
                              "y": 100
                            },
                            {
                              "x": 2840,
                              "y": 110
                            },
                            {
                              "x": 3062,
                              "y": 120
                            },
                            {
                              "x": 3313,
                              "y": 130
                            },
                            {
                              "x": 3560,
                              "y": 140
                            },
                            {
                              "x": 3983,
                              "y": 158
                            },
                            {
                              "x": 4095,
                              "y": 165
                            }
                          ],
                          "max_valid": 4096,
                          "min_valid": 1,
                          "param_key": "dut_485_1",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "fuelsensor",
                          "type": "sensor_type",
                          "value": "Датчик топлива"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Зажигание",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0,
                              "b": 1,
                              "fromValue": 26500
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 26500,
                              "y": 1
                            }
                          ],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "ignition",
                          "type": "sensor_type",
                          "value": "Датчик зажигания"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Пробег",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "mileage_cur",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "mileage",
                          "type": "sensor_type",
                          "value": "Датчик пробега"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Напряжение [mV]",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "power",
                          "type": "sensor_type",
                          "value": "Датчик напряжения"
                        }
                      }
                    ]
                  },
                  "services": {
                    "type": "array",
                    "items": {},
                    "example": []
                  },
                  "terminal_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "navtelecom"
                      },
                      "type": {
                        "type": "string",
                        "example": "terminal_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Navtelecom"
                      }
                    }
                  },
                  "trailers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "date_from": {
                          "type": "string",
                          "example": "2022-10-03 00:00:00"
                        },
                        "date_to": {
                          "type": "string",
                          "example": "2022-10-04 00:00:00"
                        },
                        "trailer": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "trailer": {
                          "id": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "trailer": {
                          "id": "d0bc0903-702b-4d96-826a-e26860681356"
                        }
                      }
                    ]
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "special_equipment"
                      },
                      "type": {
                        "type": "string",
                        "example": "unit_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Спецтехника"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/units/validate": {
                  "value": {
                    "custom_fields": [
                      {
                        "group": "cf_custom",
                        "key": "S-2551",
                        "name": "S-2551",
                        "sort": 0,
                        "value": "#31"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minparktime",
                        "name": "Мин. время стоянки (сек)",
                        "sort": 1,
                        "value": "600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minfilling",
                        "name": "Мин. объем заправки",
                        "sort": 1,
                        "value": "20"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_summerconsump",
                        "name": "Расход летом (л/100км.)",
                        "sort": 1,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "analyst",
                        "name": "Аналитик",
                        "sort": 1,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_mileagecoeff",
                        "name": "Коэф. пробега",
                        "sort": 2,
                        "value": "1.0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_msgignorestart",
                        "name": "Игнор-ть сообщ-я после начала движения",
                        "sort": 2,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterconsump",
                        "name": "Расход зимой (л/100км.)",
                        "sort": 2,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "installer",
                        "name": "Установщик",
                        "sort": 2,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_minmovespeed",
                        "name": "Мин. скорость движ-я (км/ч)",
                        "sort": 3,
                        "value": "1"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minstaytheft",
                        "name": "Мин. время остановки для опр-ия слива",
                        "sort": 3,
                        "value": "60"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingsummer",
                        "name": "На холостом ходу летом (л./час.)",
                        "sort": 3,
                        "value": "0"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_fillings_minitheft",
                        "name": "Мин. объем слива",
                        "sort": 4,
                        "value": "25"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_date",
                        "name": "Дата установки",
                        "sort": 4,
                        "value": "16.07.2019"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_idlingwinter",
                        "name": "На холостом ходу зимой (л./час.)",
                        "sort": 4,
                        "value": "0"
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintripdist",
                        "name": "Мин. расст-ие поездки (м)",
                        "sort": 4,
                        "value": "100"
                      },
                      {
                        "group": "cf_trips",
                        "key": "advanced_maxintervalmsg",
                        "name": "Макс. интервал между сообщ-ми (сек)",
                        "sort": 5,
                        "value": "3600"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_math_coeffunderload",
                        "name": "Коэф. при движении под нагрузкой",
                        "sort": 5,
                        "value": "0"
                      },
                      {
                        "group": "cf_etc",
                        "key": "install_place",
                        "name": "Место установки в ТС",
                        "sort": 5,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_maxdistancemsg",
                        "name": "Макс. расст-ие между сообщ-ми (м)",
                        "sort": 6,
                        "value": "1000"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterfrom",
                        "name": "Первый месяц зимы (январь-1)",
                        "sort": 6,
                        "value": "11"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number",
                        "name": "Серийный номер терминала",
                        "sort": 6,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mintriptime",
                        "name": "Мин. время поездки (сек)",
                        "sort": 7,
                        "value": "300"
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_consumption_winterto",
                        "name": "Последний месяц зимы (январь-1)",
                        "sort": 7,
                        "value": "3"
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut",
                        "name": "Серийный номер ДУТ",
                        "sort": 7,
                        "value": ""
                      },
                      {
                        "group": "cf_fuel",
                        "key": "fuel_price",
                        "name": "Стоимость (1 л.)",
                        "sort": 8,
                        "value": "45"
                      },
                      {
                        "group": "cf_trips",
                        "key": "key_tripdetector_movedetect",
                        "name": "Опр-ие движ-я",
                        "sort": 8,
                        "value": "speedkph"
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut_seal_serial_number",
                        "name": "Серийный номер пломбы ДУТ",
                        "sort": 8,
                        "value": ""
                      },
                      {
                        "group": "cf_trips",
                        "key": "tripdetector_mileagedetect",
                        "name": "Определение пробега",
                        "sort": 9,
                        "value": "mileage_GPS"
                      },
                      {
                        "group": "cf_etc",
                        "key": "license_plate_number",
                        "name": "Гос номер",
                        "sort": 9,
                        "value": ""
                      },
                      {
                        "group": "cf_motohours",
                        "key": "key_motohourdetector",
                        "name": "Определение моточасов",
                        "sort": 10,
                        "value": "ignition"
                      },
                      {
                        "group": "cf_etc",
                        "key": "hours_rate",
                        "name": "Норма часов в день",
                        "sort": 10,
                        "value": "8"
                      },
                      {
                        "group": "cf_etc",
                        "key": "block_date",
                        "name": "Дата блокировки(yyyy-MM-dd)",
                        "sort": 11,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "kp",
                        "name": "КП",
                        "sort": 12,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "dut",
                        "name": "ДУТ",
                        "sort": 13,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "second_sim",
                        "name": "Вторая sim",
                        "sort": 14,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_1",
                        "name": "Серийный номер ДУТ 1",
                        "sort": 15,
                        "value": ""
                      },
                      {
                        "group": "cf_etc",
                        "key": "serial_number_dut_2",
                        "name": "Серийный номер ДУТ 2",
                        "sort": 16,
                        "value": ""
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagekey",
                        "name": "translate.custom_fields.name.counters_mileagekey",
                        "sort": 1000,
                        "value": "gps_mileage"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileagecurr",
                        "name": "translate.custom_fields.name.counters_mileagecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_mileageauto",
                        "name": "translate.custom_fields.name.counters_mileageauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_engienecurr",
                        "name": "translate.custom_fields.name.counters_engienecurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprscurr",
                        "name": "translate.custom_fields.name.counters_gprscurr",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "counters_gprsauto",
                        "name": "translate.custom_fields.name.counters_gprsauto",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_speedlimit",
                        "name": "translate.custom_fields.name.advanced_speedlimit",
                        "sort": 1000,
                        "value": "130"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_urbspeedlimit",
                        "name": "translate.custom_fields.name.advanced_urbspeedlimit",
                        "sort": 1000,
                        "value": "60"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "advanced_dailyengine",
                        "name": "translate.custom_fields.name.advanced_dailyengine",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_movedetectkey",
                        "name": "translate.custom_fields.name.tripdetector_movedetectkey",
                        "sort": 1000,
                        "value": "speed"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_gpscorrect",
                        "name": "translate.custom_fields.name.tripdetector_gpscorrect",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_minsatellites",
                        "name": "translate.custom_fields.name.tripdetector_minsatellites",
                        "sort": 1000,
                        "value": "3"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "tripdetector_mintipdist",
                        "name": "translate.custom_fields.name.tripdetector_mintipdist",
                        "sort": 1000,
                        "value": "100"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_fillingstop",
                        "name": "translate.custom_fields.name.fuel_fillings_fillingstop",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_fillings_ignorefiltration",
                        "name": "translate.custom_fields.name.fuel_fillings_ignorefiltration",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenameslevel",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenameslevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_mergenamesconsum",
                        "name": "translate.custom_fields.name.fuel_sensors_mergenamesconsum",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_timelevel",
                        "name": "translate.custom_fields.name.fuel_sensors_timelevel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_sensors_filtervalues",
                        "name": "translate.custom_fields.name.fuel_sensors_filtervalues",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_idling",
                        "name": "translate.custom_fields.name.fuel_math_idling",
                        "sort": 1000,
                        "value": "2"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_urbcycle",
                        "name": "translate.custom_fields.name.fuel_math_urbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_math_suburbcycle",
                        "name": "translate.custom_fields.name.fuel_math_suburbcycle",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_levelsensors",
                        "name": "translate.custom_fields.name.fuel_level_levelsensors",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_repivalid",
                        "name": "translate.custom_fields.name.fuel_level_repivalid",
                        "sort": 1000,
                        "value": "true"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_impulsefuel",
                        "name": "translate.custom_fields.name.fuel_level_impulsefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_maximpulse",
                        "name": "translate.custom_fields.name.fuel_level_maximpulse",
                        "sort": 1000,
                        "value": "0"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_skipfirstzero",
                        "name": "translate.custom_fields.name.fuel_level_skipfirstzero",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_absolutefuel",
                        "name": "translate.custom_fields.name.fuel_level_absolutefuel",
                        "sort": 1000,
                        "value": "false"
                      },
                      {
                        "group": "cf_hidden",
                        "key": "fuel_level_instantfuel",
                        "name": "translate.custom_fields.name.fuel_level_instantfuel",
                        "sort": 1000,
                        "value": "false"
                      }
                    ],
                    "drivers": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "user": {
                          "id": "bd3b26b7-506d-4cc6-8ab6-bf4cd1b9a39c"
                        }
                      }
                    ],
                    "icon": {
                      "key": "excavator_green",
                      "type": "unit_icon",
                      "value": "Иконка"
                    },
                    "imei": "123412312",
                    "name": "КамАЗ 5490",
                    "phonenumber": "+79990000008",
                    "phonenumber2": "+34324343443",
                    "sensors": [
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "ДУТ-1",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0.087,
                              "b": 0,
                              "fromValue": 0
                            },
                            {
                              "a": 0.0282,
                              "b": 6.7606,
                              "fromValue": 115
                            },
                            {
                              "a": 0.0312,
                              "b": 5.3583,
                              "fromValue": 470
                            },
                            {
                              "a": 0.0332,
                              "b": 3.7209,
                              "fromValue": 791
                            },
                            {
                              "a": 0.0383,
                              "b": -1.8391,
                              "fromValue": 1092
                            },
                            {
                              "a": 0.0394,
                              "b": -3.2677,
                              "fromValue": 1353
                            },
                            {
                              "a": 0.0413,
                              "b": -6.405,
                              "fromValue": 1607
                            },
                            {
                              "a": 0.0412,
                              "b": -6.0905,
                              "fromValue": 1849
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2092
                            },
                            {
                              "a": 0.0403,
                              "b": -4.3548,
                              "fromValue": 2216
                            },
                            {
                              "a": 0.042,
                              "b": -8.3193,
                              "fromValue": 2340
                            },
                            {
                              "a": 0.0403,
                              "b": -4.1532,
                              "fromValue": 2459
                            },
                            {
                              "a": 0.0389,
                              "b": -0.5058,
                              "fromValue": 2583
                            },
                            {
                              "a": 0.045,
                              "b": -17.9279,
                              "fromValue": 2840
                            },
                            {
                              "a": 0.0398,
                              "b": -1.992,
                              "fromValue": 3062
                            },
                            {
                              "a": 0.0405,
                              "b": -4.1295,
                              "fromValue": 3313
                            },
                            {
                              "a": 0.0426,
                              "b": -11.4893,
                              "fromValue": 3560
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 3983
                            },
                            {
                              "a": 0.0625,
                              "b": -90.9375,
                              "fromValue": 4095
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 0,
                              "y": 0
                            },
                            {
                              "x": 115,
                              "y": 10
                            },
                            {
                              "x": 470,
                              "y": 20
                            },
                            {
                              "x": 791,
                              "y": 30
                            },
                            {
                              "x": 1092,
                              "y": 40
                            },
                            {
                              "x": 1353,
                              "y": 50
                            },
                            {
                              "x": 1607,
                              "y": 60
                            },
                            {
                              "x": 1849,
                              "y": 70
                            },
                            {
                              "x": 2092,
                              "y": 80
                            },
                            {
                              "x": 2216,
                              "y": 85
                            },
                            {
                              "x": 2340,
                              "y": 90
                            },
                            {
                              "x": 2459,
                              "y": 95
                            },
                            {
                              "x": 2583,
                              "y": 100
                            },
                            {
                              "x": 2840,
                              "y": 110
                            },
                            {
                              "x": 3062,
                              "y": 120
                            },
                            {
                              "x": 3313,
                              "y": 130
                            },
                            {
                              "x": 3560,
                              "y": 140
                            },
                            {
                              "x": 3983,
                              "y": 158
                            },
                            {
                              "x": 4095,
                              "y": 165
                            }
                          ],
                          "max_valid": 4096,
                          "min_valid": 1,
                          "param_key": "dut_485_1",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "fuelsensor",
                          "type": "sensor_type",
                          "value": "Датчик топлива"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Зажигание",
                        "param1": {
                          "calibrationABlist": [
                            {
                              "a": 0,
                              "b": 1,
                              "fromValue": 26500
                            }
                          ],
                          "calibrationXYlist": [
                            {
                              "x": 26500,
                              "y": 1
                            }
                          ],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "ignition",
                          "type": "sensor_type",
                          "value": "Датчик зажигания"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Пробег",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "mileage_cur",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "mileage",
                          "type": "sensor_type",
                          "value": "Датчик пробега"
                        }
                      },
                      {
                        "formula": "S1",
                        "hide_in_reports": false,
                        "invalid": false,
                        "name": "Напряжение [mV]",
                        "param1": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "voltage_main",
                          "smoothing": 0
                        },
                        "param2": {
                          "calibrationABlist": [],
                          "calibrationXYlist": [],
                          "param_key": "skif_text",
                          "smoothing": 0
                        },
                        "type": {
                          "key": "power",
                          "type": "sensor_type",
                          "value": "Датчик напряжения"
                        }
                      }
                    ],
                    "services": [],
                    "terminal_type": {
                      "key": "navtelecom",
                      "type": "terminal_type",
                      "value": "Navtelecom"
                    },
                    "trailers": [
                      {
                        "date_from": "2022-10-03 00:00:00",
                        "date_to": "2022-10-04 00:00:00",
                        "trailer": {
                          "id": "fcaf9265-5a5b-4d35-8b00-ee146b8dc8f6"
                        }
                      },
                      {
                        "date_from": "2022-10-05 00:00:00",
                        "date_to": "2022-10-10 00:00:00",
                        "trailer": {
                          "id": "d0bc0903-702b-4d96-826a-e26860681356"
                        }
                      }
                    ],
                    "type": {
                      "key": "special_equipment",
                      "type": "unit_type",
                      "value": "Спецтехника"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/unitsgroup": {
      "get": {
        "tags": [
          "Группы объектов"
        ],
        "summary": "/unitsgroup?ids=:ids",
        "description": "**Получение групп объектов**\n\n---\n\nПараметр 'ids' опциональный - в случае его отсутствия получим все группы по текущей активной компании.\n\nЕсли в параметре ids указаны конкретные id групп (через запятую), то получим только их.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример ответа:**\n\n```\n[\n   {\n      \"id\":\"1a48c7d0-8ca7-4790-b001-7cc92075dabe\",\n      \"company_id\":\"11111111-1111-1111-1111-111111111111\",\n      \"name\":\"Группа Доставка\",\n      \"units\":[\n         {\n            \"id\":\"ccea7542-6016-4e77-b61b-31e957300de6\",\n            \"company_id\":\"11111111-1111-1111-1111-111111111111\",\n            \"name\":\"testName-0\",\n            \"type\":{\n               \"key\":\"farm_equipment\",\n               \"type\":\"unit_type\",\n               \"value\":\"Сельхозтехника\"\n            },\n            \"terminal_type\":{\n               \"key\":\"navtelecom\",\n               \"type\":\"terminal_type\",\n               \"value\":\"navtelecom\"\n            },\n            \"imei\":\"4690f00d-64a6-4326-95dd-acf64bbf02d9\",\n            \"phonenumber\":\"8(914)3333333\",\n            \"icon\":{\n               \"key\":\"school-bus_orange\",\n               \"type\":\"unit_icon\",\n               \"value\":\"иконка\"\n            },\n            \"services\":[\n            ],\n            \"sensors\":[\n            ],\n            \"custom_fields\":[\n               {\n                  \"key\":\"limit\",\n                  \"value\":\"123\"\n               },\n               {\n                  \"key\":\"power\",\n                  \"value\":\"123w\"\n               }\n            ]\n         },\n         {\n            \"id\":\"df2415f9-7533-436e-9f93-78dbeacd8e29\",\n            \"company_id\":\"11111111-1111-1111-1111-111111111111\",\n            \"name\":\"testName-1\",\n            \"type\":{\n               \"key\":\"farm_equipment\",\n               \"type\":\"unit_type\",\n               \"value\":\"Сельхозтехника\"\n            },\n            \"terminal_type\":{\n               \"key\":\"navtelecom\",\n               \"type\":\"terminal_type\",\n               \"value\":\"navtelecom\"\n            },\n            \"imei\":\"225abdec-9f2d-4b98-89c7-a83993f97beb\",\n            \"phonenumber\":\"8(914)3333333\",\n            \"icon\":{\n               \"key\":\"school-bus_orange\",\n               \"type\":\"unit_icon\",\n               \"value\":\"иконка\"\n            },\n            \"services\":[\n            ],\n            \"sensors\":[\n            ],\n            \"custom_fields\":[\n               {\n                  \"key\":\"limit\",\n                  \"value\":\"123\"\n               },\n               {\n                  \"key\":\"power\",\n                  \"value\":\"123w\"\n               }\n            ]\n         }\n      ]\n   }\n]\n\n ```",
        "operationId": "unitsgroupIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Группы объектов"
        ],
        "summary": "/unitsgroup",
        "description": "**Создание группы**\n\n---\n\n**Параметры:**\n\n\"name\" - Имя группы. НЕ МОЖЕТ быть пустым или отсутствовать!  \n\"units\" - Массив существующих объектов, достаточно передать только id. Может быть пустым, либо вообще отсутствовать.  \nhide_in_lists, true если нужно \"Скрыть в списках\"\n\nall_units_included, true если это группа Все объекты в которую автоматически попадают все создаваемые и копируемые объекты\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"name\": \"Группа Доставка\", //\n    \"units\": [             // Массив существующих id объектов\n        {\n            \"id\": \"286e35d1-0d2e-481a-89b7-91755aabef54\"\n        },\n        {\n            \"id\": \"abdb4866-1128-489d-8a2f-179533fd5971\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n   \"id\":\"b6d098f8-dd71-48e0-b812-8460eadf7b2e\",\n   \"company_id\":\"11111111-1111-1111-1111-111111111111\",\n   \"name\":\"Группа Доставка\",\n   \"units\":[\n      {\n         \"id\":\"2ecbc434-c05c-4e8b-9905-ffa554fd18e0\",\n         \"company_id\":\"11111111-1111-1111-1111-111111111111\",\n         \"name\":\"testName-0\",\n      },\n      {\n         \"id\":\"8e42b82c-62bf-4678-b26e-b0636c9d7e66\",\n         \"company_id\":\"11111111-1111-1111-1111-111111111111\",\n         \"name\":\"testName-1\"\n      }\n   ],\n}\n\n ```",
        "operationId": "unitsgroup",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Группа Доставка"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "286e35d1-0d2e-481a-89b7-91755aabef54"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      },
                      {
                        "id": "abdb4866-1128-489d-8a2f-179533fd5971"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/unitsgroup": {
                  "value": {
                    "name": "Группа Доставка",
                    "units": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      },
                      {
                        "id": "abdb4866-1128-489d-8a2f-179533fd5971"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Группы объектов"
        ],
        "summary": "/unitsgroup?ids=:ids",
        "description": "**Планирование удаления группы объектов**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "unitsgroupIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/unitsgroup": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/unitsgroup/list": {
      "post": {
        "tags": [
          "Группы объектов"
        ],
        "summary": "/unitsgroup/list",
        "description": "**Получение списка групп**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Запрос:**\n\nВ fields указать нужные поля.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\n\"id\"- Id группы\n\n\"name\" - Имя группы.  \n\"units\" - Массив объектов в группе  \n\"users\" - Массив пользователей имеющий доступ в эту группу. Пустой, если группа не общедоступна внутри компании\n\n---\n\n**Пример запроса:**\n\n```\n{\"fields\":[\"id\",\"name\",\"units.id\",\"units.name\",\"users.id\",\"units.imei\"]}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"c6608022-7d69-4531-b8c5-190afc4aade1\",\n            \"name\": \"Группа1\",\n            \"units\": [\n                {\n                    \"id\": \"b1c87520-e0b0-469f-baf7-4ec446679867\",\n                    \"name\": \"Ford В456ВВ777\",\n                    \"imei\": \"862531040000007\"\n                },\n                {\n                    \"id\": \"c5f41d3c-4388-47bc-b7d0-928415591218\",\n                    \"name\": \"МАЗ 606 TTA 03\",\n                    \"imei\": \"8625310400000051\"\n                },\n                {\n                    \"id\": \"cdac02c5-ac08-46bd-968d-91da19732784\",\n                    \"name\": \"КамАЗ 5490 (А123АА777)23\",\n                    \"imei\": \"862531040000005\"\n                }\n            ],\n            \"users\": [\n                {\n                    \"id\": \"ec8dc446-f72e-4524-88be-2980c960706a\"\n                },\n                {\n                    \"id\": \"202cf740-d05d-4661-aaa9-c80e6a38c09a\"\n                },\n                {\n                    \"id\": \"c9bb3e9c-d02d-4ead-930b-2dd174da2f11\"\n                }\n            ]\n        },\n        {\n            \"id\": \"3dfbed67-c6b1-4a2c-9781-db54f627bad8\",\n            \"name\": \"Группа2\",\n            \"units\": [\n                {\n                    \"id\": \"8d09c650-d870-4677-9c22-a9977c347e49\",\n                    \"name\": \"Е789ЕЕ777 (#938)\",\n                    \"imei\": \"862531040000006\"\n                },\n                {\n                    \"id\": \"a9f4bd65-f56c-45ab-865f-9c36d04ce2c2\",\n                    \"name\": \"Ford В456ВВ777\",\n                    \"imei\": \"862531040000007\"\n                },\n                {\n                    \"id\": \"cfb99142-b07e-40ee-97f0-be19a99db46e\",\n                    \"name\": \"Кран Урал 676 STA 03\",\n                    \"imei\": \"862531040000008\"\n                }\n            ],\n            \"users\": [\n                {\n                    \"id\": \"7ddd3ef0-ea36-4000-997e-30a7954fc0bf\"\n                },\n                {\n                    \"id\": \"c69be66f-5bad-49cf-bdf6-53983eb9d234\"\n                },\n                {\n                    \"id\": \"28500618-ad5d-46d8-8f60-f3534d7af1d2\"\n                }\n            ]\n        }\n    ]\n}\n\n ```",
        "operationId": "unitsgroupList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Группа Доставка"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "286e35d1-0d2e-481a-89b7-91755aabef54"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      },
                      {
                        "id": "abdb4866-1128-489d-8a2f-179533fd5971"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/unitsgroup/list": {
                  "value": {
                    "name": "Группа Доставка",
                    "units": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      },
                      {
                        "id": "abdb4866-1128-489d-8a2f-179533fd5971"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/unitsgroup/{unitsgroup_id}": {
      "put": {
        "tags": [
          "Группы объектов"
        ],
        "summary": "/unitsgroup/:unitsgroup_id ",
        "description": "**Изменение группы**\n\n---\n\nCписок units заменяется полностью.\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "unitsgroupUnitsgroupId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Группа Доставка"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "286e35d1-0d2e-481a-89b7-91755aabef54"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/unitsgroup/:unitsgroup_id ": {
                  "value": {
                    "name": "Группа Доставка",
                    "units": [
                      {
                        "id": "286e35d1-0d2e-481a-89b7-91755aabef54"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unitsgroup_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор группы объектов (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Группы объектов"
        ],
        "summary": "/unitsgroup/:unitsgroup_id ",
        "description": "**Удаление группы**\n\n---\n\nГруппа удаляется физически.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример ответа:**\n\n```\nпустая строка (при этом response status = 200)\n\n ```",
        "operationId": "unitsgroupUnitsgroupId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unitsgroup_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор группы объектов (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "unitsgroup_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/units_drivers": {
      "get": {
        "tags": [
          "Смены"
        ],
        "summary": "/units_drivers?ids=:ids",
        "description": "**Поиск смен по ID (через запятую)**\n\n---\n\nВозвращает массив смен.  \nЕсли параметр 'ids' пустой (т.е. запрос = 'GET /units_drivers', без параметра), то вернётся список всех связей всех компаний пользователя, из которого исключаются удаленные связи. Если ids не пустой (т.е. запрос = 'GET /units_drivers?ids=00215-54021..,25541-454754-4513..'), то вернётся список только из запрошенных связей.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретная смена.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n/units_drivers?ids=da47b5da-d030-44f0-acc4-a43107dbb090\n\n ```\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"unit\": {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"user\": {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2020-10-01 10:00:00\",\n    \"date_to\": \"2020-11-01 18:00:00\"\n}\n\n ```",
        "operationId": "unitsDriversIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Смены"
        ],
        "summary": "/units_drivers",
        "description": "**Создание смены**\n\n---\n\n**Параметры:**\n\n```\n\"unit\": {\"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"} указать ID объекта в unit.id, обязательно\n\"user\": {\"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"}, указать ID водителя(пользователя) в user.id, необязательно\n\"date_from\": \"2020-10-01 10:00:00\", дата и время от, обязательно\n\"date_to\": \"2020-11-01 18:00:00\", дата и время до, не обязательно\n\"custom_fields\": [ // пользовательские доп поля: // смотри GET /custom_fields\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синий\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n]\n\n ```\n\n---\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"unit\" : {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"user\" : {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2020-10-01 10:00:00\",\n    \"date_to\": \"2020-11-01 18:00:00\",\n    \"custom_fields\": [\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синый\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданная смена\n\n```\n{\n    \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"unit\": {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"user\": {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2020-10-01 10:00:00\",\n    \"date_to\": \"2020-11-01 18:00:00\",\n    \"custom_fields\": [\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синый\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n    ]\n}\n\n ```",
        "operationId": "unitsDrivers",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_from": {
                    "type": "string",
                    "example": "2020-10-01 10:00:00"
                  },
                  "date_to": {
                    "type": "string",
                    "example": "2020-11-01 18:00:00"
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    }
                  },
                  "user": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/units_drivers": {
                  "value": {
                    "date_from": "2020-10-01 10:00:00",
                    "date_to": "2020-11-01 18:00:00",
                    "unit": {
                      "id": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                    },
                    "user": {
                      "id": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Смены"
        ],
        "summary": "/units_drivers?ids=:ids",
        "description": "**Планирование удаления связи объект-водитель**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "unitsDriversIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/units_drivers": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/units_drivers_bulk": {
      "post": {
        "tags": [
          "Смены"
        ],
        "summary": "/units_drivers_bulk",
        "description": "**Создание нескольких смен**\n\n---\n\n**Параметры:**\n\n```\n\"unit\": {\"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"} указать ID объекта в unit.id, обязательно\n\"user\": {\"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"}, указать ID водителя(пользователя) в user.id, необязательно\n\"dates\" : [\n    {\n        \"date_from\": \"2021-02-01 18:00:00\",\n        \"date_to\": \"2021-02-02 04:00:00\"\n    },\n    {\n        \"date_from\": \"2021-02-03 18:00:00\",\n        \"date_to\": \"2021-02-04 04:00:00\"\n    },\n    {\n        \"date_from\": \"2021-02-10 18:00:00\",\n        \"date_to\": \"2021-02-11 04:00:00\"\n    }\n] // даты и время смены, date_from -  начала, date_to - окончания\n\"custom_fields\": [ // пользовательские доп поля: // смотри GET /custom_fields\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синый\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n]\n\n ```\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"unit\" : {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"user\" : {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2020-10-01 10:00:00\",\n    \"date_to\": \"2020-11-01 18:00:00\",\n    \"dates\" : [\n        {\n            \"date_from\": \"2021-02-01 18:00:00\",\n            \"date_to\": \"2021-02-02 04:00:00\"\n        },\n        {\n            \"date_from\": \"2021-02-03 09:00:00\",\n            \"date_to\": \"2021-02-03 18:00:00\"\n        }\n    ]\n    \"custom_fields\": [\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синый\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданные смены в виде массива - одна запись для каждой даты.\n\n```\n[\n{\n    \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"unit\": {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"user\": {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2021-02-01 18:00:00\",\n    \"date_to\": \"2021-02-02 04:00:00\",\n    \"custom_fields\": [\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синый\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n    ]\n},\n{\n    \"id\": \"ed47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"unit\": {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"user\": {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2021-02-03 09:00:00\",\n    \"date_to\": \"2021-02-03 18:00:00\",\n    \"custom_fields\": [\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синый\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n    ]\n}\n]\n\n ```",
        "operationId": "unitsDriversBulk",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_from": {
                    "type": "string",
                    "example": "2020-10-01 10:00:00"
                  },
                  "date_to": {
                    "type": "string",
                    "example": "2020-11-01 18:00:00"
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    }
                  },
                  "user": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/units_drivers_bulk": {
                  "value": {
                    "date_from": "2020-10-01 10:00:00",
                    "date_to": "2020-11-01 18:00:00",
                    "unit": {
                      "id": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                    },
                    "user": {
                      "id": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/units_drivers/{id}": {
      "put": {
        "tags": [
          "Смены"
        ],
        "summary": "/units_drivers/:id",
        "description": "**Обновить данные смены**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Параметры:**\n\nсм метод POST /units_drivers\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /units_drivers?ids=:id",
        "operationId": "unitsDriversId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                  },
                  "date_from": {
                    "type": "string",
                    "example": "2020-10-01 10:00:00"
                  },
                  "date_to": {
                    "type": "string",
                    "example": "2020-11-01 18:00:00"
                  },
                  "id": {
                    "type": "string",
                    "example": "62184dd3-38c0-4476-a549-cc371199eb27"
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    }
                  },
                  "user": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/units_drivers/:id": {
                  "value": {
                    "company_id": "d88cb614-7d0e-48d5-ba95-0001825d68a8",
                    "date_from": "2020-10-01 10:00:00",
                    "date_to": "2020-11-01 18:00:00",
                    "id": "62184dd3-38c0-4476-a549-cc371199eb27",
                    "unit": {
                      "id": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                    },
                    "user": {
                      "id": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Смены"
        ],
        "summary": "/units_drivers/:id",
        "description": "**Удаление смены по ее id**\n\n---\n\n**Параметры:**\n\nid смены\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:** 200\n\nЕсли смена с таким id не найдена, то возвращается ошибка 422\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "unitsDriversId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID смены"
        }
      ]
    },
    "/api_v1/units_drivers/list": {
      "post": {
        "tags": [
          "Смены"
        ],
        "summary": "/units_drivers/list",
        "description": "**Получить смены по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[date_from, date_to, created, is_delete\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - unit.id, user.id, date_from, date_to  \nЕсли использованы date_from, date_to тогда выбирается смены которые пересекаются с \\[date_from, date_to\\] интервалом.\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 смен, отсортированные по возрастанию даты начала, связанные с объектом с ID 7e1aaba2-625a-4a4c-b765-9934bec5a096 и в октябре 2020 года\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"date_from\",\n    \"sortDesc\": \"false\",\n    \"conditions\": [\n        {\n            \"field\": \"unit.id\",\n            \"value\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n        },\n        {\n            \"field\": \"date_from\",\n            \"value\": \"2020-10-01 00:00:00\"\n        },\n        {\n            \"field\": \"date_to\",\n            \"value\": \"2020-11-01 00:00:00\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"user\": {\n                \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n            },\n            \"date_from\": \"2020-09-05 10:00:00\",\n            \"date_to\": \"2020-10-05 18:00:00\"\n        },\n        {\n            \"id\": \"d604452b-9e9d-4e01-817d-b0d391138569\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"user\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-10-15 10:00:00\",\n            \"date_to\": \"2020-11-21 18:00:00\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Еще один пример запроса:**\n\nПолучить первые 10 смен, отсортированные по возрастанию даты окончания по убыванию, связанные с водителем (пользователь) с ID 22ae4a3c-f742-460c-9479-63f08c81b5c3\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"date_to\",\n    \"sortDesc\": \"true\",\n    \"conditions\": [\n        {\n            \"field\": \"user.id\",\n            \"value\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 3,\n    \"list\": [\n        {\n            \"id\": \"f9c60641-0393-4345-aa2a-aadb869db3c9\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"cc1c4c33-5895-4fec-9295-020ffcee9372\"\n            },\n            \"user\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2021-01-01 10:00:00\"\n        },\n        {\n            \"id\": \"d604452b-9e9d-4e01-817d-b0d391138569\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"user\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-11-01 10:00:00\",\n            \"date_to\": \"2020-12-01 18:00:00\"\n        },\n        {\n            \"id\": \"5acc2fd1-e63a-4c10-95d0-22eaf59439ae\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"cc1c4c33-5895-4fec-9295-020ffcee9372\"\n            },\n            \"user\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-09-01 10:00:00\",\n            \"date_to\": \"2020-10-01 18:00:00\"\n        }\n    ]\n}\n\n ```",
        "operationId": "unitsDriversList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "unit.id"
                        },
                        "value": {
                          "type": "string",
                          "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "unit.id",
                        "value": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 10
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "sortDesc": {
                    "type": "string",
                    "example": "false"
                  },
                  "sortField": {
                    "type": "string",
                    "example": "date_from"
                  }
                }
              },
              "examples": {
                "/units_drivers/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "unit.id",
                        "value": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    ],
                    "count": 10,
                    "from": 0,
                    "sortDesc": "false",
                    "sortField": "date_from"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/units_trailers": {
      "post": {
        "tags": [
          "Прицепы объектов"
        ],
        "summary": "/units_trailers",
        "description": "**Связать объект и прицеп на определенный период**\n\n---\n\n**Параметры:**\n\n```\n\"unit\": {\"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"} указать ID объекта в unit.id, обязательно\n\"trailer\": {\"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"}, указать ID прицепа в trailer.id, обязательно\n\"date_from\": \"2020-10-01 10:00:00\", дата и время от, обязательно\n\"date_to\": \"2020-11-01 18:00:00\", дата и время до, необязательно,\n\"min_speed\": 1.5, Мин. скорость в км/ч, необязательно,\n\"max_speed\": 10.5, Макс. скорость в км/ч, необязательно,\n\"work_type\": \"Обработка поля\" Тип работ, необязательно,\n\n ```\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"unit\" : {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"trailer\" : {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2020-10-01 10:00:00\",\n    \"date_to\": \"2020-11-01 18:00:00\",\n    \"min_speed\": 1.5,\n    \"max_speed\": 10.5,\n    \"work_type\": \"Обработка поля\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданная связь\n\n```\n{\n    \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"unit\": {\n        \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n    },\n    \"trailer\": {\n        \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n    },\n    \"date_from\": \"2020-10-01 10:00:00\",\n    \"date_to\": \"2020-11-01 18:00:00\",\n    \"min_speed\": 1.5,\n    \"max_speed\": 10.5,\n    \"work_type\": \"Обработка поля\"\n}\n\n ```",
        "operationId": "unitsTrailers",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_from": {
                    "type": "string",
                    "example": "2020-10-01 10:00:00"
                  },
                  "date_to": {
                    "type": "string",
                    "example": "2020-11-01 18:00:00"
                  },
                  "trailer": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7c4253d5-4bc6-4885-bf25-985a75919fb4"
                      }
                    }
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/units_trailers": {
                  "value": {
                    "date_from": "2020-10-01 10:00:00",
                    "date_to": "2020-11-01 18:00:00",
                    "trailer": {
                      "id": "7c4253d5-4bc6-4885-bf25-985a75919fb4"
                    },
                    "unit": {
                      "id": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Прицепы объектов"
        ],
        "summary": "/units_trailers?ids=:ids",
        "description": "**Планирование удаления связи прицепы-объекты**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "unitsTrailersIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/units_trailers": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "get": {
        "tags": [
          "Прицепы объектов"
        ],
        "summary": "Получение списка связей объектов и прицепов",
        "description": "Возвращает список связей объектов и прицепов. Поддерживается фильтрация по списку ID через query-параметр ids.",
        "operationId": "get_api_v1_units_trailers",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "required": false,
            "description": "Идентификаторы связей через запятую",
            "schema": {
              "type": "string",
              "example": "da47b5da-d030-44f0-acc4-a43107dbb090"
            }
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/units_trailers/{id}": {
      "put": {
        "tags": [
          "Прицепы объектов"
        ],
        "summary": "/units_trailers/:id",
        "description": "**Обновить данные связи**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Параметры:**\n\nсм метод POST /units_trailers\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /units_trailers?ids=:id",
        "operationId": "unitsTrailersId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                  },
                  "date_from": {
                    "type": "string",
                    "example": "2020-10-05 10:00:00"
                  },
                  "date_to": {
                    "type": "string",
                    "example": "2020-11-05 18:00:00"
                  },
                  "id": {
                    "type": "string",
                    "example": "da47b5da-d030-44f0-acc4-a43107dbb090"
                  },
                  "trailer": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7c4253d5-4bc6-4885-bf25-985a75919fb4"
                      }
                    }
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/units_trailers/:id": {
                  "value": {
                    "company_id": "d88cb614-7d0e-48d5-ba95-0001825d68a8",
                    "date_from": "2020-10-05 10:00:00",
                    "date_to": "2020-11-05 18:00:00",
                    "id": "da47b5da-d030-44f0-acc4-a43107dbb090",
                    "trailer": {
                      "id": "7c4253d5-4bc6-4885-bf25-985a75919fb4"
                    },
                    "unit": {
                      "id": "7e1aaba2-625a-4a4c-b765-9934bec5a096"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Прицепы объектов"
        ],
        "summary": "/units_trailers/:id",
        "description": "**Удаление связи по его ID**\n\n---\n\n**Параметры:**\n\nid связи\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:**\n\n200\n\nЕсли связь с таким id не найдена, то возвращается ошибка 422\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "unitsTrailersId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID связи"
        }
      ]
    },
    "/api_v1/units_trailers/list": {
      "post": {
        "tags": [
          "Прицепы объектов"
        ],
        "summary": "/units_trailes/list",
        "description": "**Получить связи объектов и прицепов по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[date_from, date_to, created, is_delete\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - unit.id, trailer.id\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 связей, отсортированные по возрастанию даты начала, связанные с объектом с ID 7e1aaba2-625a-4a4c-b765-9934bec5a096\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"date_from\",\n    \"sortDesc\": \"false\",\n    \"conditions\": [\n        {\n            \"field\": \"unit.id\",\n            \"value\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"trailer\": {\n                \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\"\n            },\n            \"date_from\": \"2020-10-05 10:00:00\",\n            \"date_to\": \"2020-11-05 18:00:00\"\n        },\n        {\n            \"id\": \"d604452b-9e9d-4e01-817d-b0d391138569\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"trailer\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-11-01 10:00:00\",\n            \"date_to\": \"2020-12-01 18:00:00\",\n             \"min_speed\": 1.5,\n            \"max_speed\": 10.5,\n            \"work_type\": \"Обработка поля\"\n        }\n    ]\n}\n\n ```\n\n**Еще один пример запроса:**\n\nПолучить первые 10 связей, отсортированные по возрастанию даты окончания, по убыванию, связанные с прицепом с ID 22ae4a3c-f742-460c-9479-63f08c81b5c3\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"date_to\",\n    \"sortDesc\": \"true\",\n    \"conditions\": [\n        {\n            \"field\": \"trailer.id\",\n            \"value\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 3,\n    \"list\": [\n        {\n            \"id\": \"f9c60641-0393-4345-aa2a-aadb869db3c9\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"cc1c4c33-5895-4fec-9295-020ffcee9372\"\n            },\n            \"trailer\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2021-01-01 10:00:00\"\n        },\n        {\n            \"id\": \"d604452b-9e9d-4e01-817d-b0d391138569\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"trailer\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-11-01 10:00:00\",\n            \"date_to\": \"2020-12-01 18:00:00\"\n        },\n        {\n            \"id\": \"5acc2fd1-e63a-4c10-95d0-22eaf59439ae\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"cc1c4c33-5895-4fec-9295-020ffcee9372\"\n            },\n            \"trailer\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-09-01 10:00:00\",\n            \"date_to\": \"2020-10-01 18:00:00\"\n        }\n    ]\n}\n\n ```",
        "operationId": "unitsTrailesList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "unit.id"
                        },
                        "value": {
                          "type": "string",
                          "example": "7e1aaba2-625a-4a4c-b765-9934bec5a097"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "unit.id",
                        "value": "7e1aaba2-625a-4a4c-b765-9934bec5a097"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 11
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "sortDesc": {
                    "type": "string",
                    "example": "false"
                  },
                  "sortField": {
                    "type": "string",
                    "example": "date_from"
                  }
                }
              },
              "examples": {
                "/units_trailes/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "unit.id",
                        "value": "7e1aaba2-625a-4a4c-b765-9934bec5a097"
                      }
                    ],
                    "count": 11,
                    "from": 0,
                    "sortDesc": "false",
                    "sortField": "date_from"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/units_states/{unit_id}": {
      "get": {
        "tags": [
          "Состояния объекта"
        ],
        "summary": "/units_states/:unit_id",
        "description": "**Получение состояний объекта**\n\n---\n\nПараметр запроса **unit_id** - ID объекта\n\nЗапрос без тела\n\n---\n\n**Пример запроса:**\n\nGET /units_states/897c7708-6758-4da0-92f7-208d8caa2f07\n\n---\n\nПример ответа:\n\nВ ответ приходят все состояния объекта в порядке убывания даты (date_from).\n\n**Поля:**\n\nid - ID состояния.\n\nname - имя состояния.\n\ndate_from - дата состояния.\n\nstate_unit - Короткая информация об объекте в этом состоянии, имеет следующие поля:\n\nid - объекта. При нажатии на редактирование необходимо открыть объект по этому ID.\n\nterminal_type - тип терминала\n\nimei - IMEI\n\n``` json\n[\n    {\n        \"id\": \"fab2f033-15de-46a4-ad7b-5ae422c0c9a2\",\n        \"name\": \"Терминал Navtelecom\",\n        \"date_from\": \"2022-10-09\",\n        \"state_unit\": {\n            \"id\": \"897c7708-6758-4da0-92f7-208d8caa2f07\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    },\n    {\n        \"id\": \"57814be3-d38f-4540-b155-184204a0fe27\",\n        \"name\": \"Начальное состояние\",\n        \"date_from\": \"2020-12-09\",\n        \"state_unit\": {\n            \"id\": \"9d34e736-4565-4d1c-b83f-fab119b44e6f\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    }\n]\n\n ```",
        "operationId": "unitsStatesUnitId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Состояния объекта"
        ],
        "summary": "/units_states/:unit_id",
        "description": "**Добавление нового состояния объекта**\n\n---\n\nПараметр запроса **unit_id** - ID объекта\n\n**Тело запроса JSON:**\n\nname - название состояния, обязательная строка.\n\nfrom_date - дата состояния, обязательное в формате yyyy-MM-dd.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\nPOST /units_states/897c7708-6758-4da0-92f7-208d8caa2f07\n\n``` json\n{\n    \"name\": \"Терминал Navtelecom\",\n    \"date_from\": \"2022-10-09\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВ ответ приходят все состояния объекта, как в запросе GET /units_states/:unit_id\n\n``` json\n[\n    {\n        \"id\": \"fab2f033-15de-46a4-ad7b-5ae422c0c9a2\",\n        \"name\": \"Терминал Navtelecom\",\n        \"date_from\": \"2022-10-09\",\n        \"state_unit\": {\n            \"id\": \"897c7708-6758-4da0-92f7-208d8caa2f07\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    },\n    {\n        \"id\": \"57814be3-d38f-4540-b155-184204a0fe27\",\n        \"name\": \"Начальное состояние\",\n        \"date_from\": \"2020-12-09\",\n        \"state_unit\": {\n            \"id\": \"9d34e736-4565-4d1c-b83f-fab119b44e6f\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    }\n]\n\n ```",
        "operationId": "unitsStatesUnitId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта мониторинга (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "unit_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        }
      ]
    },
    "/api_v1/units_states/{id}": {
      "put": {
        "tags": [
          "Состояния объекта"
        ],
        "summary": "/units_states/:id",
        "description": "**Обновление состояния объекта**\n\n---\n\nПараметр запроса id - ID состояния\n\n**Тело запроса JSON:**\n\nname - название состояния, обязательная строка.\n\nfrom_date - дата состояния, обязательное в формате yyyy-MM-dd\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\nPUT /units_states/fab2f033-15de-46a4-ad7b-5ae422c0c9a2\n\n``` json\n{\n    \"id\": \"fab2f033-15de-46a4-ad7b-5ae422c0c9a2\",\n    \"name\": \"Терминал Gelileo\",\n    \"date_from\": \"2022-10-10\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВ ответ приходят все состояния объекта, как в запросе GET /units_states/:unit_id\n\n``` json\n[\n    {\n        \"id\": \"fab2f033-15de-46a4-ad7b-5ae422c0c9a2\",\n        \"name\": \"Терминал Gelileo\",\n        \"date_from\": \"2022-10-10\",\n        \"state_unit\": {\n            \"id\": \"04e234d4-1a35-402b-ad4b-16d0969e389e\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    },\n    {\n        \"id\": \"57814be3-d38f-4540-b155-184204a0fe27\",\n        \"name\": \"Начальное состояние\",\n        \"date_from\": \"2020-12-09\",\n        \"state_unit\": {\n            \"id\": \"9d34e736-4565-4d1c-b83f-fab119b44e6f\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    }\n]\n\n ```",
        "operationId": "unitsStatesId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_from": {
                    "type": "string",
                    "example": "2022-10-10"
                  },
                  "id": {
                    "type": "string",
                    "example": "fab2f033-15de-46a4-ad7b-5ae422c0c9a2"
                  },
                  "name": {
                    "type": "string",
                    "example": "Терминал Gelileo"
                  }
                }
              },
              "examples": {
                "/units_states/:id": {
                  "value": {
                    "date_from": "2022-10-10",
                    "id": "fab2f033-15de-46a4-ad7b-5ae422c0c9a2",
                    "name": "Терминал Gelileo"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Состояния объекта"
        ],
        "summary": "/units_states/:id",
        "description": "**Удаление состояния объекта**\n\n---\n\nПараметр запроса id - ID состояния\n\n---\n\n**Пример запроса:**\n\nDELETE /units_states/fab2f033-15de-46a4-ad7b-5ae422c0c9a2\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример ответа:**\n\nВ ответ приходят все состояния объекта, как в запросе GET /units_states/:unit_id\n\n``` json\n[\n    {\n        \"id\": \"57814be3-d38f-4540-b155-184204a0fe27\",\n        \"name\": \"Начальное состояние\",\n        \"date_from\": \"2020-12-09\",\n        \"state_unit\": {\n            \"id\": \"9d34e736-4565-4d1c-b83f-fab119b44e6f\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    }\n]\n\n ```",
        "operationId": "unitsStatesId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_from": {
                    "type": "string",
                    "example": "2022-10-10"
                  },
                  "id": {
                    "type": "string",
                    "example": "fab2f033-15de-46a4-ad7b-5ae422c0c9a2"
                  },
                  "name": {
                    "type": "string",
                    "example": "Терминал Gelileo"
                  }
                }
              },
              "examples": {
                "/units_states/:id": {
                  "value": {
                    "date_from": "2022-10-10",
                    "id": "fab2f033-15de-46a4-ad7b-5ae422c0c9a2",
                    "name": "Терминал Gelileo"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID состояния"
        }
      ]
    },
    "/api_v1/units_states/{id}/copy": {
      "post": {
        "tags": [
          "Состояния объекта"
        ],
        "summary": "/units_states/:id/copy",
        "description": "**Копирование состояния объекта**\n\n---\n\nПараметр запроса id - ID состояния\n\nБез тела запроса.\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\nPOST /units_states/fab2f033-15de-46a4-ad7b-5ae422c0c9a2/copy\n\n---\n\n**Пример ответа:**\n\nВ ответ приходят все состояния объекта, как в запросе GET /units_states/:unit_id\n\n``` json\n[\n    {\n        \"id\": \"5ec2659e-b05d-4907-9d6c-2ae595e361f0\",\n        \"name\": \"Копия: Начальное состояние\",\n        \"date_from\": \"2024-01-18\",\n        \"state_unit\": {\n            \"id\": \"04e234d4-1a35-402b-ad4b-16d0969e389e\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    },\n    {\n        \"id\": \"57814be3-d38f-4540-b155-184204a0fe27\",\n        \"name\": \"Начальное состояние\",\n        \"date_from\": \"2020-12-09\",\n        \"state_unit\": {\n            \"id\": \"0efe7ee0-4748-4f9c-a1b6-0d7c70afa628\",\n            \"terminal_type\": {\n                \"key\": \"navtelecom\",\n                \"type\": \"terminal_type\",\n                \"value\": \"Navtelecom\"\n            },\n            \"imei\": \"862531040000004\"\n        }\n    }\n]\n\n ```",
        "operationId": "unitsStatesIdCopy",
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/units_states/:id/copy": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID состояния"
        }
      ]
    },
    "/api_v1/units_states_count": {
      "post": {
        "tags": [
          "Состояния объекта"
        ],
        "summary": "Подсчет изменений состояний объектов в группах",
        "description": "Возвращает количество смен состояний (ревизий конфигурации) по каждому объекту в указанных группах за выбранный интервал времени.",
        "operationId": "unitsStatesCount",
        "requestBody": {
          "description": "Параметры фильтрации по группам и временному интервалу",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "groups",
                  "from",
                  "to"
                ],
                "properties": {
                  "groups": {
                    "type": "array",
                    "description": "Массив групп объектов",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
                        }
                      }
                    }
                  },
                  "from": {
                    "type": "string",
                    "description": "Начало периода (YYYY-MM-DD или YYYY-MM-DD HH:mm:ss)",
                    "example": "2026-09-01 00:00:00"
                  },
                  "to": {
                    "type": "string",
                    "description": "Конец периода (YYYY-MM-DD или YYYY-MM-DD HH:mm:ss)",
                    "example": "2026-09-26 23:59:59"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Список объектов с количеством зафиксированных состояний",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    },
                    "example": {
                      "e06bdde8-6f5b-48f1-8406-4fbd61fbe036": 2
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/trailers": {
      "get": {
        "tags": [
          "Прицепы"
        ],
        "summary": "/trailers?ids=:ids",
        "description": "**Поиск прицепов по ID (через запятую)**\n\n---\n\nВозвращает массив прицепов.  \nЕсли параметр 'ids' пустой (т.е. запрос = 'GET /trailers', без параметра), то вернётся список всех прицепов по всем компаниям пользователя, из которого исключаются удаленные прицепы.\n\nЕсли ids не пустой (т.е. запрос = 'GET /trailers?ids=00215-54021..,25541-454754-4513..'), то вернётся список только из запрошенных прицепов.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретный прицеп.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n/trailers?ids=7c4253d5-4bc6-4885-bf25-985a75919fb4&\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"name\": \"Прецеп1\",\n    \"code\": \"XYZ111222333\",\n    \"description\": \"Описания прецепа1\",\n    \"width\": 2.5,\n    \"custom_fields\": [\n        {\n            \"name\": \"масса\",\n            \"key\": \"масса\",\n            \"value\": \"20 т\",\n            \"group\": \"custom\"\n        },\n        {\n            \"name\": \"цвет\",\n            \"key\": \"цвет\",\n            \"value\": \"синый\",\n            \"group\": \"custom\"\n        }\n    ]\n}\n\n ```",
        "operationId": "trailersIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Прицепы"
        ],
        "summary": "/trailers",
        "description": "**Создание прицепа**\n\n---\n\n**Параметры:**\n\n```\n\"name\": строка, номер, наименование прецепа,\n\"code\": строка, уникальный код прицепа\n\"description\": строка, описания прицепа\n\"width\": число, ширина прицепа\n\"custom_fields\": [ // пользовательские доп поля: // смотри GET /custom_fields\n    {\"name\": \"цвет\", 'key': 'цвет', \"value\": \"синый\"},\n    {\"name\": \"масса\", \"key\": \"масса\", \"value\": \"20 т\"}\n\n ```\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\nПример запроса:\n\n```\n{\n    \"code\": \"XYZ111222333\",\n    \"name\": \"Прецеп1\",\n    \"description\": \"Описания прецепа1\",\n    \"width\": 2.5,\n    \"custom_fields\": [\n        {\n            \"name\": \"масса\",\n            \"key\": \"масса\",\n            \"value\": \"20 т\"\n        },\n        {\n            \"name\": \"цвет\",\n            \"key\": \"цвет\",\n            \"value\": \"синый\"\n        }\n    ]\n}\n\n ```\n\n---\n\nПример ответа:\n\nВозвращается созданный прицеп\n\n```\n{\n    \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"name\": \"Прецеп1\",\n    \"code\": \"XYZ111222333\",\n    \"description\": \"Описания прецепа1\",\n    \"width\": 2.5,\n    \"custom_fields\": [\n        {\n            \"name\": \"масса\",\n            \"key\": \"масса\",\n            \"value\": \"20 т\",\n            \"group\": \"custom\"\n        },\n        {\n            \"name\": \"цвет\",\n            \"key\": \"цвет\",\n            \"value\": \"синый\",\n            \"group\": \"custom\"\n        }\n    ]\n}\n\n ```",
        "operationId": "trailers",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "example": "XYZ111222333"
                  },
                  "custom_fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "масса"
                        },
                        "name": {
                          "type": "string",
                          "example": "масса"
                        },
                        "value": {
                          "type": "string",
                          "example": "20 т"
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "масса",
                        "name": "масса",
                        "value": "20 т"
                      },
                      {
                        "key": "цвет",
                        "name": "цвет",
                        "value": "синый"
                      }
                    ]
                  },
                  "description": {
                    "type": "string",
                    "example": "Описания прецепа2"
                  },
                  "name": {
                    "type": "string",
                    "example": "Прицеп Krone MegaLiner"
                  }
                }
              },
              "examples": {
                "/trailers": {
                  "value": {
                    "code": "XYZ111222333",
                    "custom_fields": [
                      {
                        "key": "масса",
                        "name": "масса",
                        "value": "20 т"
                      },
                      {
                        "key": "цвет",
                        "name": "цвет",
                        "value": "синый"
                      }
                    ],
                    "description": "Описания прецепа2",
                    "name": "Прицеп Krone MegaLiner"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Прицепы"
        ],
        "summary": "/trailers?ids=:ids",
        "description": "**Планирование удаления прицепов**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "trailersIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/trailers": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/trailers/{trailer_id}": {
      "put": {
        "tags": [
          "Прицепы"
        ],
        "summary": "/trailers/:trailer_id",
        "description": "**Обновление данных прицепа**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Параметры:**\n\nсм метод POST /trailers\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /trailers?ids=:trailer_id",
        "operationId": "trailersTrailerId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "example": "XYZ111222333"
                  },
                  "company_id": {
                    "type": "string",
                    "example": "d88cb614-7d0e-48d5-ba95-0001825d68a8"
                  },
                  "custom_fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "group": {
                          "type": "string",
                          "example": "custom"
                        },
                        "key": {
                          "type": "string",
                          "example": "масса"
                        },
                        "name": {
                          "type": "string",
                          "example": "масса"
                        },
                        "value": {
                          "type": "string",
                          "example": "19 т"
                        }
                      }
                    },
                    "example": [
                      {
                        "group": "custom",
                        "key": "масса",
                        "name": "масса",
                        "value": "19 т"
                      },
                      {
                        "group": "custom",
                        "key": "цвет",
                        "name": "цвет",
                        "value": "красный"
                      },
                      {
                        "group": "custom",
                        "key": "123",
                        "name": "123",
                        "value": "456"
                      }
                    ]
                  },
                  "description": {
                    "type": "string",
                    "example": "новая описания прецепа1"
                  },
                  "id": {
                    "type": "string",
                    "example": "7c4253d5-4bc6-4885-bf25-985a75919fb4"
                  },
                  "name": {
                    "type": "string",
                    "example": "Прицеп Schmitz Cargobull"
                  }
                }
              },
              "examples": {
                "/trailers/:trailer_id": {
                  "value": {
                    "code": "XYZ111222333",
                    "company_id": "d88cb614-7d0e-48d5-ba95-0001825d68a8",
                    "custom_fields": [
                      {
                        "group": "custom",
                        "key": "масса",
                        "name": "масса",
                        "value": "19 т"
                      },
                      {
                        "group": "custom",
                        "key": "цвет",
                        "name": "цвет",
                        "value": "красный"
                      },
                      {
                        "group": "custom",
                        "key": "123",
                        "name": "123",
                        "value": "456"
                      }
                    ],
                    "description": "новая описания прецепа1",
                    "id": "7c4253d5-4bc6-4885-bf25-985a75919fb4",
                    "name": "Прицеп Schmitz Cargobull"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "trailer_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор прицепа (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "7c4253d5-4bc6-4885-bf25-985a75919fb4"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Прицепы"
        ],
        "summary": "/trailers/:trailer_id",
        "description": "Удаление прицепа по его id\n\n---\n\n**Параметры:**\n\nid прицепа\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Ответ:** 200\n\nЕсли прицеп с таким id не найден возвращается ошибка 422\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "trailersTrailerId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "trailer_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор прицепа (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "7c4253d5-4bc6-4885-bf25-985a75919fb4"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "trailer_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID прицепа"
        }
      ]
    },
    "/api_v1/trailers/list": {
      "post": {
        "tags": [
          "Прицепы"
        ],
        "summary": "/trailes/list",
        "description": "**Получить прицепы по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[name, created, is_delete\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - name (можно искать по неполному слову), code, description\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 прицепов, отсортированные по возрастанию, по имени, которые имеют ID прицепа 7e1aaba2-625a-4a4c-b765-9934bec5a096\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"name\",\n    \"sortDesc\": \"false\",\n    \"conditions\": [\n        {\n            \"field\": \"name\",\n            \"value\": \"Прицеп1 новое название\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 1,\n    \"list\": [\n        {\n            \"id\": \"7c4253d5-4bc6-4885-bf25-985a75919fb4\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"name\": \"Прицеп1 новое название\",\n            \"code\": \"XYZ111222333\",\n            \"description\": \"новое описание прецепа1\",\n            \"width\": 2.5,\n            \"custom_fields\": [\n                {\n                    \"name\": \"масса\",\n                    \"key\": \"масса\",\n                    \"value\": \"19 т\",\n                    \"group\": \"custom\"\n                },\n                {\n                    \"name\": \"цвет\",\n                    \"key\": \"цвет\",\n                    \"value\": \"красный\",\n                    \"group\": \"custom\"\n                },\n                {\n                    \"name\": \"123\",\n                    \"key\": \"123\",\n                    \"value\": \"456\",\n                    \"group\": \"custom\"\n                }\n            ]\n        }\n    ]\n}\n\n ```",
        "operationId": "trailesList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "name"
                        },
                        "value": {
                          "type": "string",
                          "example": "Прицеп Schmitz Cargobull"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "name",
                        "value": "Прицеп Schmitz Cargobull"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 10
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "sortDesc": {
                    "type": "string",
                    "example": "false"
                  },
                  "sortField": {
                    "type": "string",
                    "example": "name"
                  }
                }
              },
              "examples": {
                "/trailes/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "name",
                        "value": "Прицеп Schmitz Cargobull"
                      }
                    ],
                    "count": 10,
                    "from": 0,
                    "sortDesc": "false",
                    "sortField": "name"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/events": {
      "get": {
        "tags": [
          "События"
        ],
        "summary": "/events?ids=:ids",
        "description": "**Поиск событий по ID (через запятую)**\n\n---\n\nВозвращает массив событий.  \nЕсли параметр 'ids' пустой (т.е. запрос = 'GET /events', без параметра), то вернётся список всех событий всех компаний пользователя, из которого исключаются удаленные связи. Если ids не пустой (т.е. запрос = 'GET /events?ids=00215-54021..,25541-454754-4513..'), то вернётся список только из запрошенных событий.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретное собитие.\n\n---\n\n**Пример запроса:**\n\n```\n/events?ids=da47b5da-d030-44f0-acc4-a43107dbb090\n\n ```\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"datetime\": \"2020-01-02 12:30:00\",\n    \"type\": {\"key\": \"filling\"},\n    \"deviation_minutes\": 20,\n    \"filled\": 101.5,\n    \"price\": \"3532.7\",\n    \"description\": \"som details\",\n    \"latitude\": 53.343243,\n    \"longitude\": 33.56432\n}\n\n ```",
        "operationId": "eventsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "События"
        ],
        "summary": "/events",
        "description": "**Создание события для объекта**\n\n---\n\n**Параметры:**\n\n```\n\"unit\": {\"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"} указать ID объекта в unit.id, обязательно\n\"type\": {\"key\": \"filling\"} // ключ типа события. Список типов может быть получен по запросу GET /dictionaries. Необходимо выбрать те записи у которых type=event_type, возможные значения: filling, theft, accident, service, waybill, random\nlatitude: Координата широты на карте. Вещественное значение\nlongitude: Координата долготы на карте. Вещественное значение\n    latitude и longitude должны выбираться на стороне клиента для всех типов события, кроме \"путевые листы\" при смене даты с помощью метода POST /point.\nОстальные поля зависят от типа события\n1) Заправка - type.key=filling\n\"datetime\": \"2020-01-01 12:30:00\", обязательное, дата и время события\n\"deviation_minutes\": 100, Отклонение, мин.:  (обязательное) - числовое поле от 0 до 1000\n\"filled\": 30.5 - Заправлено топлива, л:  (обязательное) - числовое поле больше 0\n\"price\": 3050.7 - Стоимость (необязательное): - числовое поле от 0.\n\"description\": \"some details\", Описание: (необязательное) - текстовое поле\n2) Слив - type.key=theft\n\"datetime\": \"2020-01-01 12:30:00\", Дата время; (Как и в Заправках)\n\"deviation_minutes\": 100, Отклонение, мин.;  (Как и в Заправках)\n\"stolen\": 20.8, Слито топлива, л;  (Как “Заправлено топлива” и в Заправках)\n\"description\": \"some details\", Описание:  (Как и в Заправках)\n3) ДТП - type.key=accident\n\"datetime\": \"2020-01-01 12:30:00\", Дата время; (Как и в Заправках)\n\"deviation_minutes\": 100, Отклонение, мин.;  (Как и в Заправках)\n\"description\": \"some details\", Описание:  (Как и в Заправках)\n4) Тех. обслуживание - type.key=service\n\"datetime\": \"2020-01-01 12:30:00\", Дата время; (Как и в Заправках)\n\"deviation_minutes\": 100, Отклонение, мин.;  (Как и в Заправках)\n\"service_name\": \"Установка ДУТ\", Название сервиса\n\"motohours\": 2345.5, Моточасы, ч: (необязательное) - числовое поле\n\"millage\": 23453.5, Пробег, км: (необязательное) - числовое поле.\n\"duration_hours\": 3.5, Длительность, ч: (необязательное) - числовое поле.\n\"price\": 3000.4, Стоимость:  (Как и в Заправках)\n\"guaranteed\": true, Гарантийный(обязательный): true/false.\n\"description\": \"some details\", Описание:  (Как и в Заправках)\nПри создании события ТО вызывается метод POST /point для получения координаты.\nОн также возвращает показания датчиков.\nПолучить моточасы из записи, где group=\"sensors\" и type=\"abs_motohours\".\nА для пробега group=\"sensors\" и type=\"mileage\".\n5) Путевой лист - type.key=waybill\n\"start_date\": \"2020-01-03 12:30:00\", Начало: дата и времемя (обязательное)\n\"finish_date\": \"2020-01-05 18:00:00\", Окончание: дата и времемя (обязательное)\n\"user_id\": ID Водителя, (необязатльное) - выбор из списка Пользователей с отметкой водитель\n\"motohours\": 2345.5, Моточасы, ч: (необязательное) - числовое поле\n\"millage\": 23453.5, Пробег, км: (необязательное) - числовое поле.\n\"filled\": 30.5 - Заправлено топлива, л:  (необязательное)\n6)Статус ТС - type.key=vehicle_status\n\"datetime\": \"2020-01-01 12:30:00\", Дата время; (Как и в Заправках)\n\"type_name\": \"В гараже\", Тип события (обязательное) текстовое поле\n\"description\": \"some details\", Описание:  (Как и в Заправках\n7)Произвольное событие - type.key=random\n\"datetime\": \"2020-01-01 12:30:00\", Дата время; (Как и в Заправках)\n\"deviation_minutes\": 100, Отклонение, мин.;  (Как и в Заправках)\n\"type_name\": \"Повышение скорости\", Тип события (обязательное) текстовое поле\n\"description\": \"some details\", Описание:  (Как и в Заправках)\n\n ```\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n\"unit\" : {\n\"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n},\n\"datetime\": \"2020-01-02 12:30:00\",\n\"type\": {\"key\": \"filling\"},\n\"deviation_minutes\": 20,\n\"filled\": 101.5,\n\"price\": \"3532.7\",\n\"description\": \"som details\",\n\"latitude\": 53.343243,\n\"longitude\": 33.56432\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданное событие\n\n```\n{\n\"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n\"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n\"datetime\": \"2020-01-02 12:30:00\",\n\"type\": {\"key\": \"filling\"},\n\"deviation_minutes\": 20,\n\"filled\": 101.5,\n\"price\": \"3532.7\",\n\"description\": \"som details\",\n\"latitude\": 53.343243,\n\"longitude\": 33.56432\n}\n\n ```\n\n---\n\nК событиям можно добавлять фотографии. Максимальное количество 10 шт. Максимальный размер одной фотографии 10 мб.\n\nПеред отправкой события, фотографии должны быть загружены на сервер.  \nЗагрузить фотографии нужно иcпользуя POST {{base_url}}/upload_photos/events.\n\nВ этот запрос нужно положить одно фото в поле file.\n\nЗапрос должен быть в формате multipart/form-data\n\nПример ответа:\n\nВозвращается два поля в JSON small и original.\n\n```\n{\n    \"small\": {\n        \"url\": \"/photos/events/fa3357f6-7ff5-4f4a-9840-99eaf3bf1de5_300.png\",\n        \"width\": 251,\n        \"height\": 300,\n        \"param_type\": \"events\"\n    },\n    \"original\": {\n        \"url\": \"/photos/events/fa3357f6-7ff5-4f4a-9840-99eaf3bf1de5_original.png\",\n        \"width\": 628,\n        \"height\": 749,\n        \"param_type\": \"events\"\n    }\n}\n\n ```\n\nsmall - для загрузки изображения в списке.\n\noriginal - для открытия оригинального фото с большим размером.\n\nЗапросить нужное фото можно через роут {{base_url}}://api_v1/{url}.  \nВсе добавленные фотографии необходимо отправлять в поле photos при создании и обновлении события.\n\n**Пример запроса:**  \nPOST /api_v1/events\n\n```\n{\n    \"unit\": {\n        \"id\": \"2bd74bab-8173-4c06-8fd8-ad923d3ad7d3\"\n    },\n    \"type\": {\n        \"key\": \"accident\"\n    },\n    \"datetime\": \"2024-03-19 09:57:58\",\n    \"deviation_minutes\": 10,\n    \"description\": \"DPT\",\n    \"latitude\": 55.6558837890625,\n    \"longitude\": 37.83785629272461,\n    \"photos\": [\n        {\n            \"small\": {\n                \"url\": \"/photos/events/5e65cfe3-31e3-4bee-83ea-b7bf23ad6bd6_300.jpeg\",\n                \"width\": 300,\n                \"height\": 200,\n                \"param_type\": \"events\"\n            },\n            \"original\": {\n                \"url\": \"/photos/events/5e65cfe3-31e3-4bee-83ea-b7bf23ad6bd6_original.jpeg\",\n                \"width\": 5184,\n                \"height\": 3456,\n                \"param_type\": \"events\"\n            }\n        },\n        {\n            \"small\": {\n                \"url\": \"/photos/events/fa3357f6-7ff5-4f4a-9840-99eaf3bf1de5_300.png\",\n                \"width\": 251,\n                \"height\": 300,\n                \"param_type\": \"events\"\n            },\n            \"original\": {\n                \"url\": \"/photos/events/fa3357f6-7ff5-4f4a-9840-99eaf3bf1de5_original.png\",\n                \"width\": 628,\n                \"height\": 749,\n                \"param_type\": \"events\"\n            }\n        }\n    ]\n}\n\n ```",
        "operationId": "events",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "datetime": {
                    "type": "string",
                    "example": "2020-01-02 12:30:00"
                  },
                  "deviation_minutes": {
                    "type": "number",
                    "example": 20
                  },
                  "filled": {
                    "type": "number",
                    "example": 101.5
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "filling"
                      }
                    }
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/events": {
                  "value": {
                    "datetime": "2020-01-02 12:30:00",
                    "deviation_minutes": 20,
                    "filled": 101.5,
                    "type": {
                      "key": "filling"
                    },
                    "unit": {
                      "id": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "События"
        ],
        "summary": "/events?ids=:ids",
        "description": "**Планирование удаления события**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Оператор и выше.",
        "operationId": "eventsIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/events": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/events/{id}": {
      "put": {
        "tags": [
          "События"
        ],
        "summary": "/events/:id",
        "description": "**Обновление данных события**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Параметры:**\n\nсм метод POST /events\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен одному событию из ответа метода GET /events?ids=:id",
        "operationId": "eventsId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                  },
                  "datetime": {
                    "type": "string",
                    "example": "2020-01-02 12:30:00"
                  },
                  "deviation_minutes": {
                    "type": "number",
                    "example": 20
                  },
                  "filled": {
                    "type": "number",
                    "example": 102.5
                  },
                  "id": {
                    "type": "string",
                    "example": "b193f468-f0cf-4551-ad0a-8615f1f0dd7a"
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "filling"
                      },
                      "type": {
                        "type": "string",
                        "example": "event_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Заправка"
                      }
                    }
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/events/:id": {
                  "value": {
                    "company_id": "3e70f167-9fad-4753-bccf-d7d47c2c648c",
                    "datetime": "2020-01-02 12:30:00",
                    "deviation_minutes": 20,
                    "filled": 102.5,
                    "id": "b193f468-f0cf-4551-ad0a-8615f1f0dd7a",
                    "type": {
                      "key": "filling",
                      "type": "event_type",
                      "value": "Заправка"
                    },
                    "unit": {
                      "id": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "События"
        ],
        "summary": "/events/:id",
        "description": "**Удаление события по его id**\n\n---\n\n**Параметры:**\n\nid события\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Ответ:** 200\n\nЕсли событие с таким id не найдено, то возвращается ошибка 422\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "eventsId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID события"
        }
      ]
    },
    "/api_v1/events/list": {
      "post": {
        "tags": [
          "События"
        ],
        "summary": "/events/list",
        "description": "**Получить события по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[type.key, unit.id\\]\n\nsortDesc - сортировка по убыванию? значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - unit.id, type.key\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 событий от 2020-01-01 00:00:00 до 2020-01-10 00:00:00, отсортированные по возрастанию type.key, для объекта с ID 7e1aaba2-625a-4a4c-b765-9934bec5a096\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"type.key\",\n    \"sortDesc\": \"false\",\n    \"conditions\": [\n        {\n            \"field\": \"unit.id\",\n            \"value\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n        },\n        {\n            \"field\": \"date_from\",\n            \"value\": \"2020-01-01 00:00:00\"\n        },\n         {\n            \"field\": \"date_to\",\n            \"value\": \"2020-01-10 00:00:00\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n           \"type\": {\n                \"key\": \"filling\"\n            },\n            \"datetime\": \"2020-01-02 12:30:00\",\n            \"deviation_minutes\": 20,\n            \"filled\": 102.5\n        },\n        {\n            \"id\": \"d604452b-9e9d-4e01-817d-b0d391138569\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n           \"type\": {\n                \"key\": \"filling\"\n            },\n            \"datetime\": \"2020-01-03 14:10:00\",\n            \"deviation_minutes\": 20,\n            \"filled\": 101.5\n        }\n    ]\n}\n\n ```",
        "operationId": "eventsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "unit.id"
                        },
                        "value": {
                          "type": "string",
                          "example": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "unit.id",
                        "value": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 10
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  }
                }
              },
              "examples": {
                "/events/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "unit.id",
                        "value": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                      }
                    ],
                    "count": 10,
                    "from": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/events/service_names": {
      "get": {
        "tags": [
          "События"
        ],
        "summary": "/events/service_names",
        "description": "Получение всех названий ТО при создании события\n\nВоозврашает Осмотр, Замена терминала, Установка ДУТ, Замена ДУТ, Калибровка ДУТ и новые введенные сервисы внутри компании\n\nПример ответа:\n\n```\n[\n    \"Осмотр\",\n    \"Замена терминала\",\n    \"Установка ДУТ\",\n    \"Замена ДУТ\",\n    \"Калибровка ДУТ\",\n    \"21\",\n    \"Terminal replacement\",\n    \"Замена ремня ГРМ\",\n    \"Новый сервмс\",\n    \"Пищевая заправка\",\n    \"Предыдущий сервис\",\n]\n\n ```\n\n---",
        "operationId": "eventsServiceNames",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/monitoring_extra": {
      "post": {
        "tags": [
          "Мониторинг"
        ],
        "summary": "Расширенные данные мониторинга (таблицы и интервалы)",
        "description": "Возвращает детализированные данные объектов (поездки, стоянки, заправки, сливы, сервисы, удаления данных) за интервал времени.",
        "operationId": "monitoringExtra",
        "requestBody": {
          "description": "Список объектов для запроса расширенных данных",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "units"
                ],
                "properties": {
                  "units": {
                    "type": "array",
                    "description": "Массив объектов (до 100)",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/report": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Генерация отчета",
        "description": "**Запрос отчета**\n\n---\n\nЗапрос отчета содержит следующие параметры:\n\n- units - массив id объектов, по которым требуется сделать отчет. Если отчет по группам, тогда groups - массив id групп объектов, по которым требуется сделать отчет.\n- template_tables - массив id таблиц. Используется ТОЛЬКО первая таблица.\n- from - время начала отчета в формате yyyy-mm-dd hh:mm:ss\n- to - время конца отчета в формате yyyy-mm-dd hh:mm:ss\n- offset - опционально. Параметр для пагинации. Определяет количество пропущенных строк, начиная с нулевой строки. Если параметр отсутствует в запросе, то по дефолту он равен 0.\n- max - опционально. Параметр для пагинации. Определяет максимальное количество строк, выдаваемое в запросе. Если параметр отсутствует в запросе, то по дефолту он равен значению всех строк, которые удалось сформировать в отчете. (Для графика это количество максимальных точек в графике. Если не приходит или значение больше 5000, тогда по умолчанию выбирается 5000).\n- selected_columns - опционально. Только для графиков или для журналов (отчет с типом chart или journal), иначе просто игнорируется. Определяет набор данных (сырых или датчиков), которые будут возвращены, вместе с данными по датчикам. Выбирается из possible_columns. Например ('selected_columns': \\[{'key': '1a590afb-bfe5-44cf-8d78-f5137bfbb7ae', 'name': 'Напряжение', 'sensor': true},{'key': 'voltage_main', 'name': 'voltage_main', 'sensor': false}\\]).\n- only_totals - опционально. Логическое значение. Если параметр отсутствует в запросе, то по дефолту он равен false. Если true, то возвращается только итоговые строки отчета.\n- sortField - опционально. Строка. Ключ поля, по которому нужно сортировать результат.\n- sortDesc - опционально. Логическое значение. True, если нужно сортировать по убыванию.\n- time_group - Группировка по времени, моожно указать hour, day, week, month\n\n\nОграничения:\n\n- Параметры offset и max следует использовать в паре.\n- Параметры sortField и sortDesc следует использовать в паре.\n- Колонки, ключи которых начинаются с \"_\", являются сервисными и не должны быть видимы на фронте, даже если у них случайно 'is_visible' = true.  \n    Типы сервисных колонок:\n\n\n```\n  - '_start_latlon_%ключ отчета%' - начальная координата\n  - '_end_latlon_%ключ отчета%' - конечная координата\n  - '_start_time_%ключ отчета%' - время начала\n  - '_end_time_%ключ отчета%' - время конца\n  - '_marker_latlon_%ключ отчета%' - координата маркера\n  - '_is_total' - Определяет, является ли строка итоговой. Итоговые строки должны быть выделены жирным шрифтом.\n\n ```\n\n---\n\n**Структура отчета:**\n\n```\n\"unit_id\": id объекта\n\"unit_name\": имя объекта\n\"report\": {\n  \"name\": //название отчета, заданное пользователем, либо, если таблица дефолтная - дефолтное имя\n  \"default_name\": //название дефолтной таблицы, если название таблицы отличается от название дефолтной таблицы.\n  \"key\": //ключ отчета. Ключ не может быть произвольным и, если таблица создана пользователем, всегда должен быть равен ключу дефолтной таблицы, на основе которой таблица создавалась. см. GET /report_templates?ids=:ids\n  \"possible_columns\": [ // список возможных полей, которые можно выбрать в журнале и графике\n      {'key': '1a590afb-bfe5-44cf-8d78-f5137bfbb7ae', 'name': 'Напряжение', 'sensor': true},\n      {'key': 'voltage_main', 'name': 'voltage_main'},\n      {'key': 'angle', 'name': 'angle'},\n      {'key': 'byte_in', 'name': 'byte_in'}\n  ]\n  \"columns\": [  //тех. информация о колонках отчета\n    {\n      \"key\": //тип колонки, определяет уникальность. Ключ заранее задается бэкендом.\n      \"name\": //имя колонки. Задается юзером в таблице перед построением отчета.\n      \"filter_min\": //мин. значение для фильтрации. Значения, не удовлетворяющие фильтру, не используются в построении отчета.\n      \"filter_max\": //мин. значение для фильтрации.\n      \"sort\": //порядковый номер колонки в отчете. Если у колонок совпадает sort, то очередность среди них определяется рандомно.\n      \"is_visible\": //видимость колонки для пользователя.\n      \"is_searchable\": //true, если можно фильтровать по этому полю.\n      \"is_sortable\": //true, если можно сортировать по этому полю.\n    }\n  ],\n  \"rows\": [ // строки отчета\n    {\n      \"№\": 1 //значение колонки, ассоциированное по принципу \"columns.key\":\"value\"\n      \"unit_name\": \"ДВД Грузовой 101 КР 04\" //значение колонки, ассоциированное по принципу \"columns.key\":\"value\"\n      \"first_datepoint\": \"2020-01-01 06:07:59\" //значение колонки, ассоциированное по принципу \"columns.key\":\"value\"\n      \"last_datepoint\": \"2020-01-02 14:01:50\" //значение колонки, ассоциированное по принципу \"columns.key\":\"value\"\n      \"_is_total\": false //данное значение является сервисным.\n    }\n  ],\n  \"max_rows\": Общее количество строк отчета, которое было построено. Необходимо для пагинации. А для графика - это количество максимальных точек в терминале в указанном интервале времени запроса.\n\n ```\n\nПро дефолтные таблицы можно почитать здесь [GET /report_templates?ids=:ids](https://)\n\n---\n\n**Пример запроса:**\n\n```\n{\n    'units': [{'id': '712ceae4-f112-4714-9a4d-afe141e47bf7'}],\n    'template_tables': [{'id': '275c6ee8-2933-4dd3-8adf-9544e26bf98a'}],\n    'from': '2020-01-01 00:00:00',\n    'to': '2020-01-06 00:00:00',\n    'offset': 0,\n    'max': 50\n}\n\n ```\n\nПример запроса с фильтром и сортировкой отчета:\n\n```\n{\n  \"units\": [\n    {\n      \"id\": \"712ceae4-f112-4714-9a4d-afe141e47bf7\"\n    }\n  ],\n  \"template_tables\": [\n    {\n      \"id\": \"275c6ee8-2933-4dd3-8adf-9544e26bf98a\"\n    }\n  ],\n  \"from\": \"2020-01-01 00:00:00\",\n  \"to\": \"2020-01-06 00:00:00\",\n  \"offset\": 0,\n  \"max\": 50,\n  \"sortField\": \"first_datepoint\",\n  \"sortDesc\": true,\n  \"conditions\": [\n    {\n      \"field\": \"sum_fillings\",\n      \"value\": \"100\",\n      \"operator\": \"ge\"\n    }\n  ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n      \"unit_id\": \"712ceae4-f112-4714-9a4d-afe141e47bf7\",\n      \"unit_name\": \"ДВД Грузовой 101 КР 04\",\n      \"report\": {\n        \"name\": \"Cтоянки\",\n        \"key\": \"stays\",\n        \"columns\": [\n          {\n            \"key\": \"№\",\n            \"name\": \"№\",\n            \"filter_min\": 0,\n            \"filter_max\": 0,\n            \"sort\": 0,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"unit_name\",\n            \"name\": \"Имя объекта\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 1,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"first_datepoint\",\n            \"name\": \"Начало\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 2,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"last_datepoint\",\n            \"name\": \"Конец\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 3,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"sum_datepoint\",\n            \"name\": \"Длительность\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 4,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"first_fillings_fuel\",\n            \"name\": \"first_fillings\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 5,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"last_address\",\n            \"name\": \"Конечный адрес\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 6,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"finish_fillings_fuel\",\n            \"name\": \"finish_fillings\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 7,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"stucked_fillings_fuel\",\n            \"name\": \"stucked_fillings\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 8,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"count_point\",\n            \"name\": \"Кол-во сообщений\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 10,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"sum_fillings_fuel\",\n            \"name\": \"расход\",\n            \"filter_min\": 0,\n            \"filter_max\": 1000,\n            \"sort\": 13,\n            \"is_visible\": true\n          },\n          {\n            \"key\": \"_is_total\",\n            \"name\": \"_is_total\",\n            \"filter_min\": 0,\n            \"filter_max\": 0,\n            \"sort\": 99999,\n            \"is_visible\": false\n          }\n        ],\n        \"rows\": [\n          {\n            \"№\": 1,\n            \"unit_name\": \"ДВД Грузовой 101 КР 04\",\n            \"first_datepoint\": \"2020-01-01 06:07:59\",\n            \"last_datepoint\": \"2020-01-01 08:45:58\",\n            \"sum_datepoint\": \"2:37:59\",\n            \"first_fillings_fuel\": 263.61,\n            \"last_address\": \"[lat: 52.984060, lon: 63.235077]\",\n            \"finish_fillings_fuel\": 243.13,\n            \"stucked_fillings_fuel\": 0,\n            \"count_point\": 765,\n            \"sum_fillings_fuel\": 20.48,\n            \"_is_total\": false\n          },\n          {\n            \"№\": 2,\n            \"unit_name\": \"ДВД Грузовой 101 КР 04\",\n            \"first_datepoint\": \"2020-01-01 08:47:39\",\n            \"last_datepoint\": \"2020-01-01 16:52:38\",\n            \"sum_datepoint\": \"8:04:59\",\n            \"first_fillings_fuel\": 243.15,\n            \"last_address\": \"[lat: 52.983917, lon: 63.235310]\",\n            \"finish_fillings_fuel\": 236.74,\n            \"stucked_fillings_fuel\": 0,\n            \"count_point\": 77,\n            \"sum_fillings_fuel\": 6.41,\n            \"_is_total\": false\n          },\n          {\n            \"№\": 3,\n            \"unit_name\": \"ДВД Грузовой 101 КР 04\",\n            \"first_datepoint\": \"2020-01-01 16:59:20\",\n            \"last_datepoint\": \"2020-01-01 17:16:10\",\n            \"sum_datepoint\": \"0:16:50\",\n            \"first_fillings_fuel\": 234.81,\n            \"last_address\": \"[lat: 52.982044, lon: 63.230095]\",\n            \"finish_fillings_fuel\": 234.2,\n            \"stucked_fillings_fuel\": 0,\n            \"count_point\": 13,\n            \"sum_fillings_fuel\": 0.61,\n            \"_is_total\": false\n          },\n          {\n            \"№\": 4,\n            \"unit_name\": \"ДВД Грузовой 101 КР 04\",\n            \"first_datepoint\": \"2020-01-01 18:47:38\",\n            \"last_datepoint\": \"2020-01-02 14:01:50\",\n            \"sum_datepoint\": \"19:14:12\",\n            \"first_fillings_fuel\": 218.77,\n            \"last_address\": \"[lat: 52.827972, lon: 62.642530]\",\n            \"finish_fillings_fuel\": 17697.64,\n            \"stucked_fillings_fuel\": 0,\n            \"count_point\": 82,\n            \"sum_fillings_fuel\": 0,\n            \"_is_total\": false\n          },\n          {\n            \"№\": 5,\n            \"unit_name\": \"ДВД Грузовой 101 КР 04\",\n            \"first_datepoint\": \"2020-01-01 06:07:59\",\n            \"last_datepoint\": \"2020-01-02 14:01:50\",\n            \"sum_datepoint\": \"29:42:12\",\n            \"first_fillings_fuel\": 263.61,\n            \"last_address\": \"[lat: 52.827972, lon: 62.642530]\",\n            \"finish_fillings_fuel\": 17697.64,\n            \"stucked_fillings_fuel\": 0,\n            \"count_point\": 256,\n            \"sum_fillings_fuel\": 27.61,\n            \"_is_total\": true\n          }\n        ],\n        \"max_rows\": 4\n      }\n    }\n\n ```\n\n---\n\n**Примеры запросов и ответов:**  \nselected_columns - для журнала можно указать максимум 6 параметров, для графика максимум 2 параметра.\n\n**1) Журнал**\n\nЕсли не указан selected_columns, то приходят дефолтные поля (datepoint, speedkph, latitude, longitude и _marker_latlon_journal)\n\nЗапрос:\n\n```\n{\n    \"units\": [{\n        \"id\": \"712ceae4-f112-4714-9a4d-afe141e47bf7\"\n    }],\n    \"template_tables\": [{\n        \"id\": \"275c6ee8-2933-4dd3-8adf-9544e26bf98a\"\n    }],\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-12-01 15:00:00\",\n    \"offset\": 0,\n    \"max\": 5\n}\n\n ```\n\nОтвет:\n\n```\n{\n    \"unit_id\": \"d20f49af-d68b-47fa-99f8-bb4e56354391\",\n    \"unit_name\": \"КамАЗ 5490 (А123АА777) Мониторинг\",\n    \"report\": {\n        \"name\": \"Журнал\",\n        \"key\": \"journal\",\n        \"possible_columns\": [{\n            \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n            \"name\": \"Напряжение\"\n        }, {\n            \"key\": \"voltage_main\",\n            \"name\": \"voltage_main\"\n        }, {\n            \"key\": \"785bb809-c6eb-4876-89c0-149f98775c70\",\n            \"name\": \"Топливо\"\n        }, {\n            \"key\": \"dut_485_1\",\n            \"name\": \"dut_485_1\"\n        }, {\n            \"key\": \"d7205a84-0c01-4c4d-9fb8-7d039a043e33\",\n            \"name\": \"Зажигание\"\n        }, {\n            \"key\": \"vol_a_in_1\",\n            \"name\": \"vol_a_in_1\"\n        }, {\n            \"key\": \"3efd7812-dcfd-4fa9-b5dc-a9f16ff8888d\",\n            \"name\": \"Резкий поворот\"\n        }, {\n            \"key\": \"acc_right\",\n            \"name\": \"acc_right\"\n        }, {\n            \"key\": \"1f742665-e78d-40e3-a4ec-369bdf5dfd28\",\n            \"name\": \"Резкое ускорение\"\n        }, {\n            \"key\": \"acc_forward\",\n            \"name\": \"acc_forward\"\n        }, {\n            \"key\": \"42773f51-cc5e-4c84-996a-e1f930d998ca\",\n            \"name\": \"Резкое торможение\"\n        }, {\n            \"key\": \"acc_back\",\n            \"name\": \"acc_back\"\n        }, {\n            \"key\": \"89fcedcf-9689-4ea5-bb9a-7879b5136427\",\n            \"name\": \"Превышение скорости\"\n        }, {\n            \"key\": \"acc_speed\",\n            \"name\": \"acc_speed\"\n        }],\n        \"columns\": [{\n            \"key\": \"№\",\n            \"name\": \"№\"\n        }, {\n            \"key\": \"_marker_latlon_journal\",\n            \"name\": \"_marker_latlon_journal\"\n        }, {\n            \"key\": \"datepoint\",\n            \"name\": \"datepoint\"\n        }, {\n            \"key\": \"speedkph\",\n            \"name\": \"speedkph\"\n        }, {\n            \"key\": \"latitude\",\n            \"name\": \"latitude\"\n        }, {\n            \"key\": \"longitude\",\n            \"name\": \"longitude\"\n        }],\n        \"rows\": [{\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:26\",\n            \"longitude\": 37.711567,\n            \"№\": 1,\n            \"_marker_latlon_journal\": [55.7962, 37.711567]\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:55\",\n            \"longitude\": 37.711567,\n            \"№\": 2,\n            \"_marker_latlon_journal\": [55.7962, 37.711567]\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:55\",\n            \"longitude\": 37.711567,\n            \"№\": 3,\n            \"_marker_latlon_journal\": [55.7962, 37.711567]\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:55\",\n            \"longitude\": 37.711567,\n            \"№\": 4,\n            \"_marker_latlon_journal\": [55.7962, 37.711567]\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 51.80577,\n            \"datepoint\": \"2020-11-01 13:40:55\",\n            \"longitude\": 68.36547,\n            \"№\": 5,\n            \"_marker_latlon_journal\": [51.80577, 68.36547]\n        }],\n        \"max_rows\": 22406\n    }\n}\n\n ```\n\nЕсли указан selected_columns, то приходят значения указанных параметров и дефолтные параметры.\n\nЗапрос:\n\n```\n{\n    \"units\": [{\n        \"id\": \"712ceae4-f112-4714-9a4d-afe141e47bf7\"\n    }],\n    \"template_tables\": [{\n        \"id\": \"275c6ee8-2933-4dd3-8adf-9544e26bf98a\"\n    }],\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-12-01 15:00:00\",\n    \"offset\": 0,\n    \"max\": 100,\n    \"selected_columns\": [{\n        \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n        \"name\": \"Напряжение\"\n    }, {\n        \"key\": \"voltage_main\",\n        \"name\": \"voltage_main\"\n    }]\n}\n\n ```\n\nОтвет:\n\n```\n{\n    \"unit_id\": \"d20f49af-d68b-47fa-99f8-bb4e56354391\",\n    \"unit_name\": \"КамАЗ 5490 (А123АА777) Мониторинг\",\n    \"report\": {\n        \"name\": \"Журнал\",\n        \"key\": \"journal\",\n        \"possible_columns\": [{\n            \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n            \"name\": \"Напряжение\"\n        }, {\n            \"key\": \"voltage_main\",\n            \"name\": \"voltage_main\"\n        }, {\n            \"key\": \"785bb809-c6eb-4876-89c0-149f98775c70\",\n            \"name\": \"Топливо\"\n        }, {\n            \"key\": \"dut_485_1\",\n            \"name\": \"dut_485_1\"\n        }, {\n            \"key\": \"d7205a84-0c01-4c4d-9fb8-7d039a043e33\",\n            \"name\": \"Зажигание\"\n        }, {\n            \"key\": \"vol_a_in_1\",\n            \"name\": \"vol_a_in_1\"\n        }, {\n            \"key\": \"3efd7812-dcfd-4fa9-b5dc-a9f16ff8888d\",\n            \"name\": \"Резкий поворот\"\n        }, {\n            \"key\": \"acc_right\",\n            \"name\": \"acc_right\"\n        }, {\n            \"key\": \"1f742665-e78d-40e3-a4ec-369bdf5dfd28\",\n            \"name\": \"Резкое ускорение\"\n        }, {\n            \"key\": \"acc_forward\",\n            \"name\": \"acc_forward\"\n        }, {\n            \"key\": \"42773f51-cc5e-4c84-996a-e1f930d998ca\",\n            \"name\": \"Резкое торможение\"\n        }, {\n            \"key\": \"acc_back\",\n            \"name\": \"acc_back\"\n        }, {\n            \"key\": \"89fcedcf-9689-4ea5-bb9a-7879b5136427\",\n            \"name\": \"Превышение скорости\"\n        }, {\n            \"key\": \"acc_speed\",\n            \"name\": \"acc_speed\"\n        }, {\n            \"key\": \"acc_left\",\n            \"name\": \"acc_left\"\n        }, {\n            \"key\": \"acc_max_angle\",\n            \"name\": \"acc_max_angle\"\n        }, {\n            \"key\": \"acc_max_minus\",\n            \"name\": \"acc_max_minus\"\n        }, {\n            \"key\": \"acc_max_plus\",\n            \"name\": \"acc_max_plus\"\n        }, {\n            \"key\": \"acc_x\",\n            \"name\": \"acc_x\"\n        }, {\n            \"key\": \"acc_y\",\n            \"name\": \"acc_y\"\n        }, {\n            \"key\": \"acc_z\",\n            \"name\": \"acc_z\"\n        }],\n        \"columns\": [{\n            \"key\": \"№\",\n            \"name\": \"№\"\n        }, {\n            \"key\": \"_marker_latlon_journal\",\n            \"name\": \"_marker_latlon_journal\"\n        }, {\n            \"key\": \"datepoint\",\n            \"name\": \"datepoint\"\n        }, {\n            \"key\": \"speedkph\",\n            \"name\": \"speedkph\"\n        }, {\n            \"key\": \"latitude\",\n            \"name\": \"latitude\"\n        }, {\n            \"key\": \"voltage_main\",\n            \"name\": \"voltage_main\"\n        }, {\n            \"key\": \"longitude\",\n            \"name\": \"longitude\"\n        }, {\n            \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n            \"name\": \"Напряжение\"\n        }],\n        \"rows\": [{\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:26\",\n            \"voltage_main\": 12251,\n            \"longitude\": 37.711567,\n            \"№\": 1,\n            \"_marker_latlon_journal\": [55.7962, 37.711567],\n            \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\": 12251.0\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:55\",\n            \"voltage_main\": 12123,\n            \"longitude\": 37.711567,\n            \"№\": 2,\n            \"_marker_latlon_journal\": [55.7962, 37.711567],\n            \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\": 12123.0\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:55\",\n            \"voltage_main\": 12123,\n            \"longitude\": 37.711567,\n            \"№\": 3,\n            \"_marker_latlon_journal\": [55.7962, 37.711567],\n            \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\": 12123.0\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 55.7962,\n            \"datepoint\": \"2020-11-01 13:39:55\",\n            \"voltage_main\": 12121,\n            \"longitude\": 37.711567,\n            \"№\": 4,\n            \"_marker_latlon_journal\": [55.7962, 37.711567],\n            \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\": 12121.0\n        }, {\n            \"speedkph\": 0,\n            \"latitude\": 51.80577,\n            \"datepoint\": \"2020-11-01 13:40:55\",\n            \"voltage_main\": 12088,\n            \"longitude\": 68.36547,\n            \"№\": 5,\n            \"_marker_latlon_journal\": [51.80577, 68.36547],\n            \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\": 12088.0\n        }],\n        \"max_rows\": 22406\n    }\n}\n\n ```\n\n---\n\n**2) График**\n\nЕсли не указан selected_columns, то приходят поля с данными datepoint, speed, is_trip, trips_intervals и значения 2 первых датчиков (если есть).\n\nЗапрос:\n\n```\n{\n    \"units\": [{\n        \"id\": \"712ceae4-f112-4714-9a4d-afe141e47bf7\"\n    }],\n    \"template_tables\": [{\n        \"id\": \"275c6ee8-2933-4dd3-8adf-9544e26bf98a\"\n    }],\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-12-01 00:00:00\"\n}\n\n ```\n\nОтвет:\n\n```\n{\n    \"unit_id\": \"d20f49af-d68b-47fa-99f8-bb4e56354391\",\n    \"unit_name\": \"КамАЗ 5490 (А123АА777) Мониторинг\",\n    \"report\": {\n        \"name\": \"график\",\n        \"key\": \"chart\",\n        \"possible_columns\": [{\n            \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n            \"name\": \"Напряжение\"\n        }, {\n            \"key\": \"voltage_main\",\n            \"name\": \"voltage_main\"\n        }, {\n            \"key\": \"785bb809-c6eb-4876-89c0-149f98775c70\",\n            \"name\": \"Топливо\"\n        }, {\n            \"key\": \"dut_485_1\",\n            \"name\": \"dut_485_1\"\n        }, {\n            \"key\": \"d7205a84-0c01-4c4d-9fb8-7d039a043e33\",\n            \"name\": \"Зажигание\"\n        }, {\n            \"key\": \"vol_a_in_1\",\n            \"name\": \"vol_a_in_1\"\n        }, {\n            \"key\": \"3efd7812-dcfd-4fa9-b5dc-a9f16ff8888d\",\n            \"name\": \"Резкий поворот\"\n        }, {\n            \"key\": \"acc_right\",\n            \"name\": \"acc_right\"\n        }, {\n            \"key\": \"1f742665-e78d-40e3-a4ec-369bdf5dfd28\",\n            \"name\": \"Резкое ускорение\"\n        }, {\n            \"key\": \"acc_forward\",\n            \"name\": \"acc_forward\"\n        }, {\n            \"key\": \"42773f51-cc5e-4c84-996a-e1f930d998ca\",\n            \"name\": \"Резкое торможение\"\n        }, {\n            \"key\": \"acc_back\",\n            \"name\": \"acc_back\"\n        }, {\n            \"key\": \"89fcedcf-9689-4ea5-bb9a-7879b5136427\",\n            \"name\": \"Превышение скорости\"\n        }, {\n            \"key\": \"acc_speed\",\n            \"name\": \"acc_speed\"\n        }, {\n            \"key\": \"acc_left\",\n            \"name\": \"acc_left\"\n        }],\n        \"columns\": [{\n            \"key\": \"datepoint\",\n            \"name\": \"datepoint\",\n            \"data\": [\"2020-11-01 13:39:26\", \"2020-11-01 13:50:12\", \"2020-11-01 14:04:40\", \"2020-11-01 16:29:09\", \"2020-11-01 19:00:52\", \"2020-11-01 19:48:12\", \"2020-11-01 20:34:44\", \"2020-11-01 21:19:05\", \"2020-11-01 21:57:05\", \"2020-11-01 22:30:46\"]\n        }, {\n            \"key\": \"speed\",\n            \"name\": \"speed\",\n            \"data\": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n        }, {\n            \"key\": \"is_trip\",\n            \"name\": \"is_trip\",\n            \"data\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n        }, {\n            \"key\": \"trips_intervals\",\n            \"name\": \"trips_intervals\",\n            \"data\": [\n                [\"2020-11-01 13:42:26\", \"2020-11-01 13:43:06\"],\n                [\"2020-11-01 14:04:04\", \"2020-11-01 14:05:15\"],\n                [\"2020-11-02 08:17:31\", \"2020-11-02 08:18:20\"],\n                [\"2020-11-02 08:23:05\", \"2020-11-02 08:29:04\"],\n                [\"2020-11-02 08:38:34\", \"2020-11-02 08:39:13\"],\n                [\"2020-11-02 08:44:11\", \"2020-11-02 08:50:27\"],\n                [\"2020-11-02 10:54:29\", \"2020-11-02 10:55:31\"],\n                [\"2020-11-02 11:52:07\", \"2020-11-02 12:03:11\"],\n                [\"2020-11-02 14:06:43\", \"2020-11-02 14:22:20\"],\n                [\"2020-11-02 15:41:19\", \"2020-11-02 15:45:19\"]\n            ]\n        }, {\n            \"key\": \"_marker_latlon_chart\",\n            \"name\": \"_marker_latlon_chart\",\n            \"data\": [\n                [52.19, 65.45],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37]\n            ]\n        }, {\n            \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n            \"name\": \"Напряжение\",\n            \"data\": [12086.14, 12455.71, 11866.95, 11813.52, 11891.0, 11885.48, 11881.95, 11879.57, 11877.76, 11873.1]\n        }, {\n            \"key\": \"785bb809-c6eb-4876-89c0-149f98775c70\",\n            \"name\": \"Топливо\",\n            \"data\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n        }],\n        \"max_rows\": 1014\n    }\n}\n\n ```\n\nЕсли указан selected_columns, то приходят поля с данными datepoint, speed, is_trip, trips_intervals и указанные параметры.\n\nЗапрос:\n\n```\n{\n    \"units\": [{\n        \"id\": \"712ceae4-f112-4714-9a4d-afe141e47bf7\"\n    }],\n    \"template_tables\": [{\n        \"id\": \"275c6ee8-2933-4dd3-8adf-9544e26bf98a\"\n    }],\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-12-01 00:00:00\",\n    \"selected_columns\": [{\n        \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n        \"name\": \"Напряжение\"\n    }, {\n        \"key\": \"angle\",\n        \"name\": \"angle\"\n    }]\n}\n\n ```\n\nОтвет:\n\n```\n{\n    \"unit_id\": \"d20f49af-d68b-47fa-99f8-bb4e56354391\",\n    \"unit_name\": \"КамАЗ 5490 (А123АА777) Мониторинг\",\n    \"report\": {\n        \"name\": \"график\",\n        \"key\": \"chart\",\n        \"possible_columns\": [{\n            \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n            \"name\": \"Напряжение\"\n        }, {\n            \"key\": \"voltage_main\",\n            \"name\": \"voltage_main\"\n        }, {\n            \"key\": \"785bb809-c6eb-4876-89c0-149f98775c70\",\n            \"name\": \"Топливо\"\n        }, {\n            \"key\": \"dut_485_1\",\n            \"name\": \"dut_485_1\"\n        }, {\n            \"key\": \"d7205a84-0c01-4c4d-9fb8-7d039a043e33\",\n            \"name\": \"Зажигание\"\n        }, {\n            \"key\": \"vol_a_in_1\",\n            \"name\": \"vol_a_in_1\"\n        }, {\n            \"key\": \"3efd7812-dcfd-4fa9-b5dc-a9f16ff8888d\",\n            \"name\": \"Резкий поворот\"\n        }, {\n            \"key\": \"acc_right\",\n            \"name\": \"acc_right\"\n        }, {\n            \"key\": \"1f742665-e78d-40e3-a4ec-369bdf5dfd28\",\n            \"name\": \"Резкое ускорение\"\n        }, {\n            \"key\": \"acc_forward\",\n            \"name\": \"acc_forward\"\n        }, {\n            \"key\": \"42773f51-cc5e-4c84-996a-e1f930d998ca\",\n            \"name\": \"Резкое торможение\"\n        }, {\n            \"key\": \"acc_back\",\n            \"name\": \"acc_back\"\n        }, {\n            \"key\": \"89fcedcf-9689-4ea5-bb9a-7879b5136427\",\n            \"name\": \"Превышение скорости\"\n        }, {\n            \"key\": \"acc_speed\",\n            \"name\": \"acc_speed\"\n        }, {\n            \"key\": \"acc_left\",\n            \"name\": \"acc_left\"\n        }, {\n            \"key\": \"acc_max_angle\",\n            \"name\": \"acc_max_angle\"\n        }, {\n            \"key\": \"acc_max_minus\",\n            \"name\": \"acc_max_minus\"\n        }, {\n            \"key\": \"acc_max_plus\",\n            \"name\": \"acc_max_plus\"\n        }, {\n            \"key\": \"acc_x\",\n            \"name\": \"acc_x\"\n        }, {\n            \"key\": \"acc_y\",\n            \"name\": \"acc_y\"\n        }, {\n            \"key\": \"acc_z\",\n            \"name\": \"acc_z\"\n        }, {\n            \"key\": \"altitude\",\n            \"name\": \"altitude\"\n        }, {\n            \"key\": \"angle\",\n            \"name\": \"angle\"\n        }, {\n            \"key\": \"box_crack\",\n            \"name\": \"box_crack\"\n        }, {\n            \"key\": \"bth_conf_st\",\n            \"name\": \"bth_conf_st\"\n        }, {\n            \"key\": \"bytes_in\",\n            \"name\": \"bytes_in\"\n        }, {\n            \"key\": \"bytes_out\",\n            \"name\": \"bytes_out\"\n        }, {\n            \"key\": \"can_accel_pos\",\n            \"name\": \"can_accel_pos\"\n        }, {\n            \"key\": \"can_break_pos\",\n            \"name\": \"can_break_pos\"\n        }, {\n            \"key\": \"can_disel_filter\",\n            \"name\": \"can_disel_filter\"\n        }],\n        \"columns\": [{\n            \"key\": \"datepoint\",\n            \"name\": \"datepoint\",\n            \"data\": [\"2020-11-01 13:39:26\", \"2020-11-01 13:50:12\", \"2020-11-01 14:04:40\", \"2020-11-01 16:29:09\", \"2020-11-01 19:00:52\", \"2020-11-01 19:48:12\", \"2020-11-01 20:34:44\", \"2020-11-01 21:19:05\", \"2020-11-01 21:57:05\", \"2020-11-01 22:30:46\"]\n        }, {\n            \"key\": \"speed\",\n            \"name\": \"speed\",\n            \"data\": [0, 1, 0, 3, 5, 6, 10, 20, 12, 0, 0]\n        }, {\n            \"key\": \"is_trip\",\n            \"name\": \"is_trip\",\n            \"data\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n        }, {\n            \"key\": \"trips_intervals\",\n            \"name\": \"trips_intervals\",\n            \"data\": [\n                [\"2020-11-01 13:42:26\", \"2020-11-01 13:43:06\"],\n                [\"2020-11-01 14:04:04\", \"2020-11-01 14:05:15\"],\n                [\"2020-11-02 08:17:31\", \"2020-11-02 08:18:20\"],\n                [\"2020-11-02 08:23:05\", \"2020-11-02 08:29:04\"],\n                [\"2020-11-02 08:38:34\", \"2020-11-02 08:39:13\"],\n                [\"2020-11-02 08:44:11\", \"2020-11-02 08:50:27\"],\n                [\"2020-11-02 10:54:29\", \"2020-11-02 10:55:31\"],\n                [\"2020-11-02 11:52:07\", \"2020-11-02 12:03:11\"],\n                [\"2020-11-02 14:06:43\", \"2020-11-02 14:22:20\"],\n                [\"2020-11-02 15:41:19\", \"2020-11-02 15:45:19\"]\n            ]\n        }, {\n            \"key\": \"_marker_latlon_chart\",\n            \"name\": \"_marker_latlon_chart\",\n            \"data\": [\n                [52.19, 65.45],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37],\n                [51.81, 68.37]\n            ]\n        }, {\n            \"key\": \"1a590afb-bfe5-44cf-8d78-f5137bfbb7ae\",\n            \"name\": \"Напряжение\",\n            \"data\": [12086.14, 12455.71, 11866.95, 11813.52, 11891.0, 11885.48, 11881.95, 11879.57, 11877.76, 11873.1]\n        }, {\n            \"key\": \"angle\",\n            \"name\": \"angle\",\n            \"data\": [111.95, 125.38, 124.71, 37.0, 37.0, 37.0, 37.0, 37.0, 37.0, 37.0]\n        }],\n        \"max_rows\": 1014\n    }\n}\n\n ```\n\nНовые поля для графика в template_tables:\n\n1. Чекбокс \"Отображать сливы и заправки\" - show_fillings_thefts, boolean\n2. Чекбокс \"Сделать отчет закрытым\" - closed_to_change, boolean\n3. Маски названия датчиков топлива - fuel_sensor_name_masks, массив имеющий поле value, как в поле sensor_name_masks\n4. \"Параметры\" - params, массив, имеет поля terminal_type_key - ключ типа протокола (если не указан или null, тогда это для всех протоколов), value-значение параметра\n\n\nПример:\n\n```\n{\n   \"id\": \"dc029d04-0ed7-4ddd-b243-d32bd9201671\",\n   \"key\": \"chart\",\n   \"name\": \"Журнал\",\n   ..\n   \"show_fillings_thefts\": true,\n   \"fuel_sensor_name_masks\": [\n      {\n         \"value\": \"Топлива1\"\n      },\n      {\n         \"value\": \"Топлива2\"\n      }\n   ],\n   \"params\": [\n      {\"terminal_type_key\": \"navtelecom\", \"value\": \"dut_485_1\"},\n      {\"value\":\"speedkph\"}\n    ],\n   \"closed_to_change\": true,\n   ...\n}\n\n ```\n\nПриходят новые элементы в columns: fillings_intervals - для заправок и thefts_intervals - для сливов. В data приходят даты начала и окончания, как в trips_intervals.\n\nПример:\n\n```\n\"columns\": [\n    ....\n    {\n        \"key\": \"fillings_intervals\",\n        \"name\": \"fillings_intervals\",\n        \"data\": [\n          [\n            \"2021-08-01 09:08:18\",\n            \"2021-08-01 09:37:19\"\n          ],\n          [\n            \"2021-08-10 08:51:51\",\n            \"2021-08-10 09:02:20\"\n          ],\n          [\n            \"2021-08-13 10:48:34\",\n            \"2021-08-13 11:13:01\"\n          ]\n        ]\n      },\n      {\n        \"key\": \"thefts_intervals\",\n        \"name\": \"thefts_intervals\",\n        \"data\": [\n          [\n            \"2021-08-11 00:00:30\",\n            \"2021-08-12 00:08:19\"\n          ]\n        ]\n      }\n  ]\n\n ```",
        "operationId": "report",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2022-05-04 10:03:00"
                  },
                  "groups": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "a0c5076d-6f22-4326-86fb-89aa837a9ab5"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "a0c5076d-6f22-4326-86fb-89aa837a9ab5"
                      }
                    ]
                  },
                  "max": {
                    "type": "number",
                    "example": 100
                  },
                  "offset": {
                    "type": "number",
                    "example": 0
                  },
                  "template_tables": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "800c0795-5b79-40cd-bdeb-ab309228534b"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ]
                  },
                  "to": {
                    "type": "string",
                    "example": "2022-07-03 11:00:11"
                  }
                }
              },
              "examples": {
                "/report": {
                  "value": {
                    "from": "2022-05-04 10:03:00",
                    "groups": [
                      {
                        "id": "a0c5076d-6f22-4326-86fb-89aa837a9ab5"
                      }
                    ],
                    "max": 100,
                    "offset": 0,
                    "template_tables": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ],
                    "to": "2022-07-03 11:00:11"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Результат построения отчета (колонки и агрегированные данные)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "unit_id": {
                      "type": "string",
                      "format": "uuid",
                      "example": "2bd74bab-8173-4c06-8fd8-ad923d3ad7d3"
                    },
                    "unit_name": {
                      "type": "string",
                      "example": "КамАЗ 5490 (А123АА777)"
                    },
                    "report": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "example": "Поездки и стоянки"
                        },
                        "key": {
                          "type": "string",
                          "example": "trips"
                        },
                        "columns": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        },
                        "max_rows": {
                          "type": "integer",
                          "example": 100
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "30 req/min",
        "parameters": []
      }
    },
    "/api_v1/report/bar_chart": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Получение данных столбчатого графика (Bar Chart) для отчета",
        "description": "Возвращает ряды данных (bar_chart_x, bar_chart_y) для построения диаграмм, если для таблицы отчета включена поддержка bar chart.",
        "operationId": "reportBarChart",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2022-09-01 00:00:00"
                  },
                  "groups": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "ae3f9037-9fcc-492c-9ba4-8063e737cf95"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "ae3f9037-9fcc-492c-9ba4-8063e737cf95"
                      }
                    ]
                  },
                  "template_tables": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "a5dc0870-78cd-4fa9-9522-eb658bb5806b"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "a5dc0870-78cd-4fa9-9522-eb658bb5806b"
                      }
                    ]
                  },
                  "to": {
                    "type": "string",
                    "example": "2022-10-01 00:00:00"
                  }
                }
              },
              "examples": {
                "/report/bar_chart": {
                  "value": {
                    "from": "2022-09-01 00:00:00",
                    "groups": [
                      {
                        "id": "ae3f9037-9fcc-492c-9ba4-8063e737cf95"
                      }
                    ],
                    "template_tables": [
                      {
                        "id": "a5dc0870-78cd-4fa9-9522-eb658bb5806b"
                      }
                    ],
                    "to": "2022-10-01 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Данные графика для визуализации",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "unit_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "unit_name": {
                      "type": "string",
                      "example": "КамАЗ 5490 (А123АА777)"
                    },
                    "report": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "30 req/min",
        "parameters": []
      }
    },
    "/api_v1/report_excel": {
      "get": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Выгрузка отчета в формате Excel (GET)",
        "description": "Формирование и скачивание отчета в формате XLSX. Параметры передаются в query-параметре body в виде URL-encoded JSON-строки.",
        "operationId": "reportExcelBody",
        "parameters": [
          {
            "name": "body",
            "in": "query",
            "required": true,
            "description": "JSON-строка с параметрами отчета (from, to, template_tables, units/groups). Пример: {\"from\":\"2026-09-01 00:00:00\",\"to\":\"2026-09-02 00:00:00\",\"template_tables\":[{\"id\":\"uuid\"}]}",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Бинарный файл книги Microsoft Excel (.xlsx)",
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "20 req/min"
      },
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Выгрузка отчета в формате Excel (POST)",
        "description": "Формирование и скачивание отчета в формате XLSX с передачей параметров в теле запроса (рекомендуется для сложных и объемных отчетов).",
        "operationId": "reportExcel",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2022-03-05 00:00:00"
                  },
                  "groups": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "5b5483dc-99bd-4577-820f-f1e4340cbd60"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "5b5483dc-99bd-4577-820f-f1e4340cbd60"
                      }
                    ]
                  },
                  "template_tables": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "800c0795-5b79-40cd-bdeb-ab309228534b"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ]
                  },
                  "to": {
                    "type": "string",
                    "example": "2022-03-06 00:00:00"
                  }
                }
              },
              "examples": {
                "/report_excel": {
                  "value": {
                    "from": "2022-03-05 00:00:00",
                    "groups": [
                      {
                        "id": "5b5483dc-99bd-4577-820f-f1e4340cbd60"
                      }
                    ],
                    "template_tables": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ],
                    "to": "2022-03-06 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Бинарный файл книги Microsoft Excel (.xlsx)",
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "20 req/min",
        "parameters": []
      }
    },
    "/api_v1/report_pdf": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Выгрузка отчета в формате PDF",
        "description": "Формирование отчета в виде документа Adobe PDF. Поддерживает включение вложений (files) в формате Base64.",
        "operationId": "reportPdf",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "c29tZV9maWxl"
                    },
                    "example": [
                      "c29tZV9maWxl"
                    ]
                  },
                  "from": {
                    "type": "string",
                    "example": "2022-04-28 00:00:00"
                  },
                  "template_tables": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "800c0795-5b79-40cd-bdeb-ab309228534b"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ]
                  },
                  "to": {
                    "type": "string",
                    "example": "2022-06-29 00:00:00"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "97fba3d2-841b-43cd-911a-073b84ad5438"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/report_pdf": {
                  "value": {
                    "files": [
                      "c29tZV9maWxl"
                    ],
                    "from": "2022-04-28 00:00:00",
                    "template_tables": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ],
                    "to": "2022-06-29 00:00:00",
                    "units": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Бинарный файл документа Adobe PDF (.pdf)",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "20 req/min",
        "parameters": []
      }
    },
    "/api_v1/report_word": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Выгрузка отчета в формате Word (DOCX)",
        "description": "Формирование отчета в формате документа Microsoft Word (.docx).",
        "operationId": "reportWord",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "c29tZV9maWxl"
                    },
                    "example": [
                      "c29tZV9maWxl"
                    ]
                  },
                  "from": {
                    "type": "string",
                    "example": "2022-04-28 00:00:00"
                  },
                  "template_tables": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "800c0795-5b79-40cd-bdeb-ab309228534b"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ]
                  },
                  "to": {
                    "type": "string",
                    "example": "2022-06-29 00:00:00"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "97fba3d2-841b-43cd-911a-073b84ad5438"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/report_word": {
                  "value": {
                    "files": [
                      "c29tZV9maWxl"
                    ],
                    "from": "2022-04-28 00:00:00",
                    "template_tables": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ],
                    "to": "2022-06-29 00:00:00",
                    "units": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Бинарный файл документа Microsoft Word (.docx)",
            "content": {
              "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "20 req/min",
        "parameters": []
      }
    },
    "/api_v1/report_any": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Универсальный запрос данных произвольного отчета",
        "description": "Универсальный шлюз получения аналитических данных по таблицам и датчикам без строгой привязки к сохраненному шаблону.",
        "operationId": "reportAny",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "c29tZV9maWxlXzE="
                    },
                    "example": [
                      "c29tZV9maWxlXzE="
                    ]
                  },
                  "from": {
                    "type": "string",
                    "example": "2022-04-28 00:00:00"
                  },
                  "template_tables": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "800c0795-5b79-40cd-bdeb-ab309228534b"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ]
                  },
                  "to": {
                    "type": "string",
                    "example": "2022-06-29 00:00:00"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "97fba3d2-841b-43cd-911a-073b84ad5438"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/report_any": {
                  "value": {
                    "files": [
                      "c29tZV9maWxlXzE="
                    ],
                    "from": "2022-04-28 00:00:00",
                    "template_tables": [
                      {
                        "id": "800c0795-5b79-40cd-bdeb-ab309228534b"
                      }
                    ],
                    "to": "2022-06-29 00:00:00",
                    "units": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Результат запроса отчета",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "30 req/min",
        "parameters": []
      }
    },
    "/api_v1/finance": {
      "get": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Получение финансового отчета по учетным записям",
        "description": "Возвращает сводные финансовые данные по компаниям и объектам. В параметре body передается JSON-строка поискового запроса: {\"search\":\"ООО ТехноЛогистика\"}.",
        "operationId": "financeBody",
        "parameters": [
          {
            "name": "body",
            "in": "query",
            "required": false,
            "description": "JSON-строка фильтрации поиска, например: {\"search\":\"ООО ТехноЛогистика\"}",
            "schema": {
              "type": "string",
              "example": "{\"search\":\"\"}"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Финансовый отчет по компаниям и объектам",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "group_name": {
                      "type": "string",
                      "example": "АДМИНКА"
                    },
                    "report": {
                      "type": "object",
                      "properties": {
                        "columns": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        },
                        "data": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/heat_maps": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Построение тепловой карты перемещений объектов",
        "description": "Агрегация гео-точек за указанный интервал времени для визуализации плотности и интенсивности перемещения транспорта на карте (Heatmap).",
        "operationId": "heatMaps",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "max_radius": {
                    "type": "number",
                    "example": 1000
                  }
                }
              },
              "examples": {
                "/heat_maps": {
                  "value": {
                    "max_radius": 1000
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Массив точек с координатами и весами плотности",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "latitude": {
                        "type": "number",
                        "example": 55.751244
                      },
                      "longitude": {
                        "type": "number",
                        "example": 37.618423
                      },
                      "weight": {
                        "type": "number",
                        "example": 0.85
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "30 req/min",
        "parameters": []
      }
    },
    "/api_v1/last_point": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Получение последних телематических данных по объектам",
        "description": "**Получение последних данных по объектам**\n\n---\n\nВ запросе можно указать объекты или одну группу\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\nПример запроса и объектами:\n\n```\n{\n    \"units\": [\n        {\n            \"id\": \"2bd74bab-8173-4c06-8fd8-ad923d3ad7d3\"\n        },\n        {\n            \"id\": \"655f9207-b19d-4df4-9cbe-442c8777baec\"\n        }\n    ]\n}\n\n ```\n\nПример запрос с группой:\n\n```\n{\n    \"groups\": [\n        {\n            \"id\": \"5dabceab-ae23-493f-8c04-8028c7066e8a\"\n        }\n    ]\n}\n\n ```\n\nВ ответе возвращаются следующий поля:\n\n```\n**по объекту**\nunit.id\nunit.name\nunit.imei\nunit.custom_fields - Ваши параметры\n**Из последнего сообщения**\nunix_timestamp\nspeed\naltitude\nsatellites\nlatitude\nlogitude\naddress\ntrip_detector - стоит или едет c учетом минимальной скорости движения (\"stop\" or \"movement\")\n\n ```\n\n```\n[\n    {\n        \"unit\": {\n            \"id\": \"2bd74bab-8173-4c06-8fd8-ad923d3ad7d3\",\n            \"imei\": \"862531040000001\",\n            \"name\": \"КамАЗ 5490 (А123АА777)\",\n            \"custom_fields\": [\n                {\n                    \"name\": \"S-2551\",\n                    \"value\": \"#1\"\n                },\n                {\n                    \"name\": \"Тип терминала\",\n                    \"value\": \"1\"\n                },\n                {\n                    \"name\": \"Осмотр 5\",\n                    \"value\": \"55555\"\n                },\n                {\n                    \"name\": \"Вторая sim\",\n                    \"value\": \"11111XYZV\"\n                }\n            ]\n        },\n        \"last_point\": {\n            \"unix_timestamp\": 1707982594,\n            \"speed\": 3,\n            \"angle\": 318,\n            \"altitude\": 1745,\n            \"satellites\": 21,\n            \"latitude\": 55.5130615234375,\n            \"longitude\": 37.7850456237793,\n            \"address\": \"г. Москва, ул. Промышленная, д. 12\",\n            \"trip_detector\": \"movement\"\n        }\n    }\n]\n\n ```",
        "operationId": "lastPoint",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "2bd74bab-8173-4c06-8fd8-ad923d3ad7d3"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "2bd74bab-8173-4c06-8fd8-ad923d3ad7d3"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/last_point": {
                  "value": {
                    "units": [
                      {
                        "id": "2bd74bab-8173-4c06-8fd8-ad923d3ad7d3"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Массив последних телематических состояний объектов",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "unit": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "example": "2bd74bab-8173-4c06-8fd8-ad923d3ad7d3"
                          },
                          "name": {
                            "type": "string",
                            "example": "КамАЗ 5490 (А123АА777)"
                          },
                          "imei": {
                            "type": "string",
                            "example": "862531040000001"
                          }
                        }
                      },
                      "last_point": {
                        "type": "object",
                        "properties": {
                          "unix_timestamp": {
                            "type": "integer",
                            "example": 1707982594
                          },
                          "speed": {
                            "type": "number",
                            "example": 64.5
                          },
                          "altitude": {
                            "type": "number",
                            "example": 156.0
                          },
                          "satellites": {
                            "type": "integer",
                            "example": 18
                          },
                          "latitude": {
                            "type": "number",
                            "example": 55.751244
                          },
                          "longitude": {
                            "type": "number",
                            "example": 37.618423
                          },
                          "address": {
                            "type": "string",
                            "example": "г. Москва, ул. Промышленная, д. 12"
                          },
                          "trip_detector": {
                            "type": "string",
                            "enum": [
                              "stop",
                              "movement"
                            ],
                            "example": "movement"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/cancel_report": {
      "post": {
        "tags": [
          "Отчеты"
        ],
        "summary": "Отмена фонового расчета отчета",
        "description": "Прерывает асинхронное выполнение генерации отчета на расчетном бэкенде по переданному _requestId.",
        "operationId": "cancelReport",
        "responses": {
          "200": {
            "description": "Запрос на отмену отчета успешно принят",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "cancelled"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "_requestId"
                ],
                "properties": {
                  "_requestId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Идентификатор запроса отчета для прерывания",
                    "example": "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d"
                  }
                }
              }
            }
          }
        },
        "parameters": []
      }
    },
    "/api_v1/report_templates": {
      "get": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Получение списка шаблонов отчетов",
        "description": "Возвращает полную конфигурацию шаблонов отчетов компании. Если передан параметр ids (через запятую), возвращает только указанные шаблоны.",
        "operationId": "reportTemplatesIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "required": false,
            "description": "Список UUID шаблонов через запятую. Если не передан или пуст — возвращаются все шаблоны.",
            "schema": {
              "type": "string",
              "example": "d98b5767-0676-447a-8e38-d85c7b2599b6"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Список шаблонов отчетов с конфигурацией таблиц и колонок",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReportTemplateItem"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min"
      },
      "post": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Создание нового шаблона отчета",
        "description": "Создает новый шаблон отчета с заданным набором таблиц, вычисляемых параметров и прав видимости.",
        "operationId": "reportTemplates",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "_default": {
                    "type": "boolean",
                    "example": false
                  },
                  "is_default": {
                    "type": "boolean",
                    "example": false
                  },
                  "name": {
                    "type": "string",
                    "example": "Шаблон123"
                  },
                  "template_tables": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "_default": {
                          "type": "boolean",
                          "example": false
                        },
                        "geozones": {
                          "type": "array",
                          "items": {},
                          "example": []
                        },
                        "id": {
                          "type": "string",
                          "example": "eea0df8a-206c-418e-955d-ec1b7b418cde"
                        },
                        "is_default": {
                          "type": "boolean",
                          "example": false
                        },
                        "key": {
                          "type": "string",
                          "example": "trips"
                        },
                        "name": {
                          "type": "string",
                          "example": "Поездки"
                        },
                        "reportTemplate": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "76c4d2a4-5c89-494d-9c26-fbfcfa144601"
                            }
                          }
                        },
                        "sensors": {
                          "type": "array",
                          "items": {},
                          "example": []
                        },
                        "show_itog": {
                          "type": "boolean",
                          "example": true
                        },
                        "template_columns": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "_visible": {
                                "type": "boolean",
                                "example": false
                              },
                              "filter_max": {
                                "type": "number",
                                "example": 1000
                              },
                              "filter_min": {
                                "type": "number",
                                "example": 0
                              },
                              "id": {
                                "type": "string",
                                "example": "ffc923bc-32a8-4097-8c94-44ea994dfe64"
                              },
                              "is_visible": {
                                "type": "boolean",
                                "example": false
                              },
                              "key": {
                                "type": "string",
                                "example": "_end_latlon_trips"
                              },
                              "name": {
                                "type": "string",
                                "example": "service column"
                              },
                              "sort": {
                                "type": "number",
                                "example": 1
                              },
                              "type": {
                                "type": "string",
                                "example": "array"
                              }
                            }
                          },
                          "example": [
                            {
                              "_visible": false,
                              "filter_max": 1000,
                              "filter_min": 0,
                              "id": "ffc923bc-32a8-4097-8c94-44ea994dfe64",
                              "is_visible": false,
                              "key": "_end_latlon_trips",
                              "name": "service column",
                              "sort": 1,
                              "type": "array"
                            }
                          ]
                        },
                        "time_group": {
                          "type": "string",
                          "example": "no_grouping"
                        }
                      }
                    },
                    "example": [
                      {
                        "_default": false,
                        "geozones": [],
                        "id": "eea0df8a-206c-418e-955d-ec1b7b418cde",
                        "is_default": false,
                        "key": "trips",
                        "name": "Поездки",
                        "reportTemplate": {
                          "id": "76c4d2a4-5c89-494d-9c26-fbfcfa144601"
                        },
                        "sensors": [],
                        "show_itog": true,
                        "template_columns": [
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "ffc923bc-32a8-4097-8c94-44ea994dfe64",
                            "is_visible": false,
                            "key": "_end_latlon_trips",
                            "name": "service column",
                            "sort": 1,
                            "type": "array"
                          }
                        ],
                        "time_group": "no_grouping"
                      },
                      {
                        "_default": false,
                        "geozones": [],
                        "id": "6f5a645e-ad5a-4465-91dc-1a90ffbc4d3e",
                        "is_default": false,
                        "key": "geozones",
                        "name": "Геозоны",
                        "reportTemplate": {
                          "id": "76c4d2a4-5c89-494d-9c26-fbfcfa144601"
                        },
                        "sensors": [],
                        "show_itog": true,
                        "template_columns": [
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "bb878209-c1ad-408e-953e-02e8ddef1a0e",
                            "is_visible": true,
                            "key": "driver",
                            "name": "Водитель",
                            "sort": 9,
                            "type": "string"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "1d75b7d7-172c-401d-8bab-95d91a5076a0",
                            "is_visible": false,
                            "key": "_start_time_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "date"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "7908d344-b5df-40df-a52a-879f1e9a3b2c",
                            "is_visible": false,
                            "key": "_end_time_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "date"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "5615c1a0-3714-4793-a38c-04144676da4a",
                            "is_visible": false,
                            "key": "_start_latlon_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "array"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "9d08ba81-9a1d-4394-ad40-ce5c1f7098fb",
                            "is_visible": false,
                            "key": "_end_latlon_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "array"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "0087503f-4c36-40c9-bc5e-a3a4742beb5c",
                            "is_visible": true,
                            "key": "unit_name",
                            "name": "Имя",
                            "sort": 1,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "e0d5dfb5-9c73-440e-b0ff-c85d26aecc42",
                            "is_visible": true,
                            "key": "first_datepoint",
                            "name": "Начало",
                            "sort": 3,
                            "type": "date"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "3d72fc84-8298-422c-beb5-bf643dcae1a9",
                            "is_visible": true,
                            "key": "last_datepoint",
                            "name": "Конец",
                            "sort": 4,
                            "type": "date"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "c303f29b-c0a4-4b00-acb0-42c12d33c208",
                            "is_visible": true,
                            "key": "sum_datepoint",
                            "name": "Длит-сть",
                            "sort": 5,
                            "type": "date"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "9e673b50-b269-46be-95f6-2cc7bf5aecc2",
                            "is_visible": true,
                            "key": "first_address",
                            "name": "Нач. адрес",
                            "sort": 6,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "8e597d69-45b6-4211-817c-0dfa13cedead",
                            "is_visible": true,
                            "key": "first_fillings",
                            "name": "Нач. знач. топл.",
                            "sort": 10,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "9b30d12f-6f9b-4da8-8f38-e0a23ed76964",
                            "is_visible": true,
                            "key": "finish_fillings",
                            "name": "Кон. знач. топл.",
                            "sort": 11,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "cd9e4983-c1ee-467e-9559-65563195ca5b",
                            "is_visible": true,
                            "key": "last_address",
                            "name": "Кон. адрес",
                            "sort": 12,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "4bbbc5ad-d404-4917-acc0-2920deaf9cce",
                            "is_visible": true,
                            "key": "avg_speedkph",
                            "name": "Ср-яя скор-ть",
                            "sort": 13,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "7ddec502-8421-4f55-baa7-bceb10841d89",
                            "is_visible": true,
                            "key": "geo_name",
                            "name": "Имя геозоны",
                            "sort": 14,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "372aee63-1746-4d14-aaa6-945425058be9",
                            "is_visible": true,
                            "key": "sum_fillings",
                            "name": "Израсх-но топл.",
                            "sort": 15,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "30870ece-3e91-4b42-be2b-94dd78055606",
                            "is_visible": true,
                            "key": "sum_distance",
                            "name": "Пробег",
                            "sort": 16,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "8ca0720d-9bf9-4b0b-9647-fb2442a7cbb9",
                            "is_visible": true,
                            "key": "max_speedkph",
                            "name": "Макс. скор-ть",
                            "sort": 17,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "c1b21477-69bd-49cd-8d83-b658b941ce46",
                            "is_visible": true,
                            "key": "sum_counter",
                            "name": "Счетчик (сум)",
                            "sort": 18,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "bfb31794-8638-4462-8f77-b4b73f55529f",
                            "is_visible": true,
                            "key": "count_point",
                            "name": "Кол-во сообщ-й",
                            "sort": 19,
                            "type": "number"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "143e031c-2145-4bf9-9a14-113388504c85",
                            "is_visible": false,
                            "key": "_unit_id",
                            "name": "service column",
                            "sort": 1,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "28ffa63d-880f-4d40-a8a6-a6ace12d5ada",
                            "is_visible": true,
                            "key": "trailer",
                            "name": "Прицеп",
                            "sort": 2100,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "6d68a50a-a146-4d49-9af3-f16047532819",
                            "is_visible": true,
                            "key": "work_types",
                            "name": "Вид работ",
                            "sort": 2200,
                            "type": "string"
                          }
                        ],
                        "time_group": "no_grouping"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/report_templates": {
                  "value": {
                    "_default": false,
                    "is_default": false,
                    "name": "Шаблон123",
                    "template_tables": [
                      {
                        "_default": false,
                        "geozones": [],
                        "id": "eea0df8a-206c-418e-955d-ec1b7b418cde",
                        "is_default": false,
                        "key": "trips",
                        "name": "Поездки",
                        "reportTemplate": {
                          "id": "76c4d2a4-5c89-494d-9c26-fbfcfa144601"
                        },
                        "sensors": [],
                        "show_itog": true,
                        "template_columns": [
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "ffc923bc-32a8-4097-8c94-44ea994dfe64",
                            "is_visible": false,
                            "key": "_end_latlon_trips",
                            "name": "service column",
                            "sort": 1,
                            "type": "array"
                          }
                        ],
                        "time_group": "no_grouping"
                      },
                      {
                        "_default": false,
                        "geozones": [],
                        "id": "6f5a645e-ad5a-4465-91dc-1a90ffbc4d3e",
                        "is_default": false,
                        "key": "geozones",
                        "name": "Геозоны",
                        "reportTemplate": {
                          "id": "76c4d2a4-5c89-494d-9c26-fbfcfa144601"
                        },
                        "sensors": [],
                        "show_itog": true,
                        "template_columns": [
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "bb878209-c1ad-408e-953e-02e8ddef1a0e",
                            "is_visible": true,
                            "key": "driver",
                            "name": "Водитель",
                            "sort": 9,
                            "type": "string"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "1d75b7d7-172c-401d-8bab-95d91a5076a0",
                            "is_visible": false,
                            "key": "_start_time_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "date"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "7908d344-b5df-40df-a52a-879f1e9a3b2c",
                            "is_visible": false,
                            "key": "_end_time_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "date"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "5615c1a0-3714-4793-a38c-04144676da4a",
                            "is_visible": false,
                            "key": "_start_latlon_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "array"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "9d08ba81-9a1d-4394-ad40-ce5c1f7098fb",
                            "is_visible": false,
                            "key": "_end_latlon_geozones",
                            "name": "service column",
                            "sort": 1,
                            "type": "array"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "0087503f-4c36-40c9-bc5e-a3a4742beb5c",
                            "is_visible": true,
                            "key": "unit_name",
                            "name": "Имя",
                            "sort": 1,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "e0d5dfb5-9c73-440e-b0ff-c85d26aecc42",
                            "is_visible": true,
                            "key": "first_datepoint",
                            "name": "Начало",
                            "sort": 3,
                            "type": "date"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "3d72fc84-8298-422c-beb5-bf643dcae1a9",
                            "is_visible": true,
                            "key": "last_datepoint",
                            "name": "Конец",
                            "sort": 4,
                            "type": "date"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "c303f29b-c0a4-4b00-acb0-42c12d33c208",
                            "is_visible": true,
                            "key": "sum_datepoint",
                            "name": "Длит-сть",
                            "sort": 5,
                            "type": "date"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "9e673b50-b269-46be-95f6-2cc7bf5aecc2",
                            "is_visible": true,
                            "key": "first_address",
                            "name": "Нач. адрес",
                            "sort": 6,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "8e597d69-45b6-4211-817c-0dfa13cedead",
                            "is_visible": true,
                            "key": "first_fillings",
                            "name": "Нач. знач. топл.",
                            "sort": 10,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "9b30d12f-6f9b-4da8-8f38-e0a23ed76964",
                            "is_visible": true,
                            "key": "finish_fillings",
                            "name": "Кон. знач. топл.",
                            "sort": 11,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "cd9e4983-c1ee-467e-9559-65563195ca5b",
                            "is_visible": true,
                            "key": "last_address",
                            "name": "Кон. адрес",
                            "sort": 12,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "4bbbc5ad-d404-4917-acc0-2920deaf9cce",
                            "is_visible": true,
                            "key": "avg_speedkph",
                            "name": "Ср-яя скор-ть",
                            "sort": 13,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "7ddec502-8421-4f55-baa7-bceb10841d89",
                            "is_visible": true,
                            "key": "geo_name",
                            "name": "Имя геозоны",
                            "sort": 14,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "372aee63-1746-4d14-aaa6-945425058be9",
                            "is_visible": true,
                            "key": "sum_fillings",
                            "name": "Израсх-но топл.",
                            "sort": 15,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "30870ece-3e91-4b42-be2b-94dd78055606",
                            "is_visible": true,
                            "key": "sum_distance",
                            "name": "Пробег",
                            "sort": 16,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "8ca0720d-9bf9-4b0b-9647-fb2442a7cbb9",
                            "is_visible": true,
                            "key": "max_speedkph",
                            "name": "Макс. скор-ть",
                            "sort": 17,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "c1b21477-69bd-49cd-8d83-b658b941ce46",
                            "is_visible": true,
                            "key": "sum_counter",
                            "name": "Счетчик (сум)",
                            "sort": 18,
                            "type": "number"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "bfb31794-8638-4462-8f77-b4b73f55529f",
                            "is_visible": true,
                            "key": "count_point",
                            "name": "Кол-во сообщ-й",
                            "sort": 19,
                            "type": "number"
                          },
                          {
                            "_visible": false,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "143e031c-2145-4bf9-9a14-113388504c85",
                            "is_visible": false,
                            "key": "_unit_id",
                            "name": "service column",
                            "sort": 1,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "28ffa63d-880f-4d40-a8a6-a6ace12d5ada",
                            "is_visible": true,
                            "key": "trailer",
                            "name": "Прицеп",
                            "sort": 2100,
                            "type": "string"
                          },
                          {
                            "_visible": true,
                            "filter_max": 1000,
                            "filter_min": 0,
                            "id": "6d68a50a-a146-4d49-9af3-f16047532819",
                            "is_visible": true,
                            "key": "work_types",
                            "name": "Вид работ",
                            "sort": 2200,
                            "type": "string"
                          }
                        ],
                        "time_group": "no_grouping"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Созданный шаблон отчета",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportTemplateItem"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "60 req/min"
      },
      "delete": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Массовое удаление шаблонов отчетов",
        "description": "Удаление нескольких шаблонов отчетов по переданному списку идентификаторов в query параметре ids.",
        "operationId": "reportTemplatesIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "required": true,
            "description": "Список UUID шаблонов через запятую для удаления",
            "schema": {
              "type": "string",
              "example": "d98b5767-0676-447a-8e38-d85c7b2599b6"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Результат удаления",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/report_templates/list": {
      "post": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Получение списка шаблонов отчетов с пагинацией и сортировкой",
        "description": "Возвращает реестр шаблонов компании с поддержкой сортировки и пагинации.",
        "operationId": "reportTemplatesList",
        "responses": {
          "200": {
            "description": "Список шаблонов отчетов с общим количеством",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "list": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ReportTemplateItem"
                      }
                    },
                    "max": {
                      "type": "integer",
                      "example": 3
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "integer",
                    "example": 0
                  },
                  "count": {
                    "type": "integer",
                    "example": 20
                  },
                  "sortField": {
                    "type": "string",
                    "example": "sort"
                  },
                  "sortDesc": {
                    "type": "boolean",
                    "example": false
                  },
                  "search": {
                    "type": "string",
                    "example": ""
                  }
                }
              }
            }
          }
        },
        "parameters": []
      }
    },
    "/api_v1/report_templates/computable_table_fields": {
      "get": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Получение вычисляемых полей для таблицы отчета",
        "description": "Возвращает список доступных полей и функций формул для указанного типа таблицы (trips, stays, sensors, statistics и др.).",
        "operationId": "reportTemplatesComputableTableFieldsTableKeyTableKey",
        "parameters": [
          {
            "name": "table_key",
            "in": "query",
            "required": true,
            "description": "Ключ таблицы отчета (trips, stays, geozones, fuel_movement и т.д.)",
            "schema": {
              "type": "string",
              "example": "trips"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Список полей с метаданными (key, name, type, unit)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "distance"
                      },
                      "name": {
                        "type": "string",
                        "example": "Пробег"
                      },
                      "type": {
                        "type": "string",
                        "example": "number"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min"
      }
    },
    "/api_v1/report_templates/excel_table_fields": {
      "get": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Получение списка полей таблицы для экспорта в Excel",
        "description": "Возвращает список колонок таблицы шаблона отчета, доступных для включения в шаблон Excel-выгрузки.",
        "operationId": "reportTemplatesExcelTableFieldsTableKeyTableKey",
        "parameters": [
          {
            "name": "table_key",
            "in": "query",
            "required": false,
            "description": "Ключ типа таблицы отчета",
            "schema": {
              "type": "string",
              "example": "trips"
            }
          },
          {
            "name": "table_id",
            "in": "query",
            "required": false,
            "description": "UUID сконфигурированной таблицы шаблона",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Список полей для Excel-экспорта",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min"
      }
    },
    "/api_v1/report_templates/table_formula_check": {
      "post": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Валидация математической формулы вычисляемого поля",
        "description": "Проверяет синтаксическую корректность математического выражения вычисляемой колонки шаблона отчета.",
        "operationId": "reportTemplatesReportTemplatesTableFormulaCheck",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "formula": {
                    "type": "string",
                    "example": "round(fuel_used / distance * 100, 2)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Результат валидации формулы",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "valid": {
                      "type": "boolean",
                      "example": true
                    },
                    "message": {
                      "type": "string",
                      "example": "Формула корректна"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/report_templates/table_validate": {
      "post": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Валидация конфигурации таблицы шаблона отчета",
        "description": "Проверяет корректность связей, фильтров и группировок таблицы перед ее сохранением в шаблон отчета.",
        "operationId": "reportTemplatesTableValidate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "column_group": {
                    "type": "string",
                    "example": ""
                  },
                  "key": {
                    "type": "string",
                    "example": "trips"
                  },
                  "name": {
                    "type": "string",
                    "example": "Поездки"
                  },
                  "show_itog": {
                    "type": "string",
                    "example": "true"
                  },
                  "template_columns": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "filter_max": {
                          "type": "string",
                          "example": "1000"
                        },
                        "filter_min": {
                          "type": "string",
                          "example": "0"
                        },
                        "is_visible": {
                          "type": "string",
                          "example": "false"
                        },
                        "key": {
                          "type": "string",
                          "example": "_unit_id"
                        },
                        "meta": {
                          "type": "string",
                          "example": "total"
                        },
                        "name": {
                          "type": "string",
                          "example": "translate.reports.default_template.columns._unit_id"
                        },
                        "sort": {
                          "type": "string",
                          "example": "1"
                        },
                        "type": {
                          "type": "string",
                          "example": "string"
                        },
                        "use_filter": {
                          "nullable": true,
                          "example": null
                        }
                      }
                    },
                    "example": [
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "false",
                        "key": "_unit_id",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns._unit_id",
                        "sort": "1",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "unit_name",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.unit_name",
                        "sort": "2",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "first_datepoint",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.first_datepoint",
                        "sort": "3",
                        "type": "date",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "last_datepoint",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.last_datepoint",
                        "sort": "4",
                        "type": "date",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "count_point",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.count_point",
                        "sort": "5",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_distance",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.sum_distance",
                        "sort": "6",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "avg_speedkph",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.avg_speedkph",
                        "sort": "7",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "100000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "drained_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.drained_fillings",
                        "sort": "7",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "100000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "stucked_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.stucked_fillings",
                        "sort": "7",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_idling_plan",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_idling_plan",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_idling",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_idling",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_plan",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_plan",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_distance_absolute_error",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.sum_distance_absolute_error",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_distance_absolute",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.sum_distance_absolute",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "max_speedkph",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.max_speedkph",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_idling_deviation",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_idling_deviation",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_price_plan",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_price_plan",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_price",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_price",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_absolute",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_absolute",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_instant",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_instant",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_deviation",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_deviation",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_absolute_error",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_absolute_error",
                        "sort": "9",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "first_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.first_fillings",
                        "sort": "9",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "finish_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.finish_fillings",
                        "sort": "10",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_consumption_rates",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_consumption_rates",
                        "sort": "11",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "motohours",
                        "meta": "motohour",
                        "name": "translate.reports.default_template.columns.motohours",
                        "sort": "12",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "motohour_idling",
                        "meta": "motohour",
                        "name": "translate.reports.default_template.columns.motohour_idling",
                        "sort": "12",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_consumption_rates_absolut",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_consumption_rates_absolut",
                        "sort": "12",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "motohour_moving",
                        "meta": "motohour",
                        "name": "translate.reports.default_template.columns.motohour_moving",
                        "sort": "13",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "driver",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.driver",
                        "sort": "2000",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "trailer",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.trailer",
                        "sort": "2100",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "work_types",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.work_types",
                        "sort": "2200",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "groups_of_unit",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.groups_of_unit",
                        "sort": "3000",
                        "type": "string",
                        "use_filter": null
                      }
                    ]
                  },
                  "template_computable_columns": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "example": "Тестовая колонка"
                        },
                        "value": {
                          "type": "string",
                          "example": "(1000 - {report_columns.sum_fillings}) * {computable_columns.Тестовая колонка2}"
                        }
                      }
                    },
                    "example": [
                      {
                        "name": "Тестовая колонка",
                        "value": "(1000 - {report_columns.sum_fillings}) * {computable_columns.Тестовая колонка2}"
                      },
                      {
                        "name": "Тестовая колонка2",
                        "value": "(300 + {report_columns.sum_fillings}) * {computable_columns.Тестовая колонка3}"
                      },
                      {
                        "name": "Тестовая колонка3",
                        "value": "(1000 - {report_columns.sum_fillings}) * {computable_columns.Тестовая колонка}"
                      }
                    ]
                  },
                  "time_group": {
                    "type": "string",
                    "example": "week"
                  }
                }
              },
              "examples": {
                "/report_templates/table_validate": {
                  "value": {
                    "column_group": "",
                    "key": "trips",
                    "name": "Поездки",
                    "show_itog": "true",
                    "template_columns": [
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "false",
                        "key": "_unit_id",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns._unit_id",
                        "sort": "1",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "unit_name",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.unit_name",
                        "sort": "2",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "first_datepoint",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.first_datepoint",
                        "sort": "3",
                        "type": "date",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "last_datepoint",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.last_datepoint",
                        "sort": "4",
                        "type": "date",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "count_point",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.count_point",
                        "sort": "5",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_distance",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.sum_distance",
                        "sort": "6",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "avg_speedkph",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.avg_speedkph",
                        "sort": "7",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "100000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "drained_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.drained_fillings",
                        "sort": "7",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "100000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "stucked_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.stucked_fillings",
                        "sort": "7",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_idling_plan",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_idling_plan",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_idling",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_idling",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_plan",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_plan",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_distance_absolute_error",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.sum_distance_absolute_error",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_distance_absolute",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.sum_distance_absolute",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "max_speedkph",
                        "meta": "trips",
                        "name": "translate.reports.default_template.columns.max_speedkph",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_idling_deviation",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_idling_deviation",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_price_plan",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_price_plan",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_price",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_price",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_absolute",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_absolute",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_instant",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_instant",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_deviation",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_deviation",
                        "sort": "8",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "sum_fillings_absolute_error",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.sum_fillings_absolute_error",
                        "sort": "9",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "first_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.first_fillings",
                        "sort": "9",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "finish_fillings",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.finish_fillings",
                        "sort": "10",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_consumption_rates",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_consumption_rates",
                        "sort": "11",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "motohours",
                        "meta": "motohour",
                        "name": "translate.reports.default_template.columns.motohours",
                        "sort": "12",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "motohour_idling",
                        "meta": "motohour",
                        "name": "translate.reports.default_template.columns.motohour_idling",
                        "sort": "12",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "fuel_consumption_rates_absolut",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.fuel_consumption_rates_absolut",
                        "sort": "12",
                        "type": "number",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "motohour_moving",
                        "meta": "motohour",
                        "name": "translate.reports.default_template.columns.motohour_moving",
                        "sort": "13",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "driver",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.driver",
                        "sort": "2000",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "trailer",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.trailer",
                        "sort": "2100",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "work_types",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.work_types",
                        "sort": "2200",
                        "type": "string",
                        "use_filter": null
                      },
                      {
                        "filter_max": "1000",
                        "filter_min": "0",
                        "is_visible": "true",
                        "key": "groups_of_unit",
                        "meta": "total",
                        "name": "translate.reports.default_template.columns.groups_of_unit",
                        "sort": "3000",
                        "type": "string",
                        "use_filter": null
                      }
                    ],
                    "template_computable_columns": [
                      {
                        "name": "Тестовая колонка",
                        "value": "(1000 - {report_columns.sum_fillings}) * {computable_columns.Тестовая колонка2}"
                      },
                      {
                        "name": "Тестовая колонка2",
                        "value": "(300 + {report_columns.sum_fillings}) * {computable_columns.Тестовая колонка3}"
                      },
                      {
                        "name": "Тестовая колонка3",
                        "value": "(1000 - {report_columns.sum_fillings}) * {computable_columns.Тестовая колонка}"
                      }
                    ],
                    "time_group": "week"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Результат валидации таблицы шаблона",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "valid": {
                      "type": "boolean",
                      "example": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/report_templates/{template_id}": {
      "put": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Обновление шаблона отчета",
        "description": "Обновляет параметры существующего шаблона отчета (название, порядок, таблицы, колонки, фильтры).",
        "operationId": "reportTemplatesTemplateId1",
        "responses": {
          "200": {
            "description": "Обновленный шаблон отчета",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportTemplateItem"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "60 req/min",
        "parameters": [
          {
            "name": "template_id",
            "in": "path",
            "required": true,
            "description": "UUID шаблона отчета",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d98b5767-0676-447a-8e38-d85c7b2599b6"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReportTemplateItem"
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Удаление шаблона отчета по ID",
        "description": "Физическое удаление шаблона отчета из базы данных системы.",
        "operationId": "reportTemplatesTemplateId",
        "responses": {
          "200": {
            "description": "Шаблон отчета успешно удален",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min",
        "parameters": [
          {
            "name": "template_id",
            "in": "path",
            "required": true,
            "description": "UUID шаблона отчета для удаления",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d98b5767-0676-447a-8e38-d85c7b2599b6"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "template_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID шаблона"
        }
      ]
    },
    "/api_v1/report_templates/time_groups": {
      "get": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Получение доступных временных группировок для таблицы отчета",
        "description": "Возвращает перечень доступных способов группировки строк отчета (по дням, по неделям, по месяцам, по объектам, по водителям, по сменам).",
        "operationId": "reportTemplatesTimeGroupsTableKeyTableKey",
        "parameters": [
          {
            "name": "table_key",
            "in": "query",
            "required": true,
            "description": "Ключ таблицы отчета (trips, stays, fuel_movement и т.д.)",
            "schema": {
              "type": "string",
              "example": "trips"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Список группировок",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "day"
                      },
                      "name": {
                        "type": "string",
                        "example": "По дням"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "120 req/min"
      }
    },
    "/api_v1/report_templates/reorder": {
      "patch": {
        "tags": [
          "Шаблоны отчетов"
        ],
        "summary": "Изменение порядка сортировки шаблонов отчетов",
        "description": "Обновляет поле sort для шаблонов отчетов компании в соответствии с переданным массивом идентификаторов.",
        "operationId": "reportTemplatesReorder",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "sort"
                  ],
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "example": "d98b5767-0676-447a-8e38-d85c7b2599b6"
                    },
                    "sort": {
                      "type": "integer",
                      "example": 1
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Порядок шаблонов успешно сохранен",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/fasttracks": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/fasttracks",
        "description": "**Запрос на получение трека юнита**\n\n---\n\nЗапрос состоит из 4 параметров.\n\nunits - id объекта, берется всегда ПЕРВЫЙ объект, передавать несколько объектов не имеет смысла.\n\nfrom - начало периода\n\nto - конец периода\n\nzoom - зумирование трека. Чем выше значение, тем больше точек будет пропущено (исключено из выборки) и тем менее точным будет сам трек. По сути, это площадь вокруг текущей точки. Будет отрисована та следующая точка, которая не попадёт в эту площадь, т.е. некий шаг пропуска.\n\nВесь трек состоит из суб-треков, так называемых отрезков, которые в свою очередь состоят из конкретных точек, в которых содержится информация о состоянии объекта в конкретный момент времени.\n\n---\n\nОтвет имеет две колонки: columns и values.\n\nprocess_id - уникальный идентификатор для выделение трека в области карты.\n\nColumns - это набор полей объекта. Данная колонка всегда статична, поэтому индекс поля в этой колонке всегда равен индексу поля в конкретных точках (т.е. Если longitude в Columns имеет индекс 2, то в каждой точке мы найдем конкретное значение для longitude под индексом 2).\n\n---\n\nПример ответа:\n\n```\n{\n    \"columns\": [\n      {\n        \"key\": \"datepoint\",\n        \"value\": \"Дата\"\n      },\n      {\n        \"key\": \"longitude\",\n        \"value\": \"Широта\"\n      },\n      {\n        \"key\": \"latitude\",\n        \"value\": \"Долгота\"\n      },\n      {\n        \"key\": \"speed\",\n        \"value\": \"Скорость\"\n      },\n      {\n        \"key\": \"angle\",\n        \"value\": \"Угол\"\n      },\n      {\n        \"key\": \"distance\",\n        \"value\": \"Дистанция\"\n      }\n    ],\n    \"values\": [\n      {\n        \"style\": \"style_0\",\n        \"points\": [\n          [\n            1578131434,\n            63.5339,\n            53.1475,\n            0,\n            101,\n            0\n          ],\n          [\n            1578198784,\n            63.5347,\n            53.1472,\n            0,\n            159,\n            62.35\n          ],\n          [\n            1578198974,\n            63.5337,\n            53.1464,\n            17,\n            160,\n            118.67\n          ]\n        ]\n      },\n      {\n        \"style\": \"style_40\",\n        \"points\": [\n          [\n            1578198974,\n            63.5337,\n            53.1464,\n            17,\n            160,\n            1682.05\n          ],\n          [\n            1578199107,\n            63.5548,\n            53.1381,\n            51,\n            132,\n            1682.05\n          ]\n        ]\n      },\n      {\n        \"style\": \"style_0\",\n        \"points\": [\n          [\n            1578199107,\n            63.5548,\n            53.1381,\n            51,\n            132,\n            742.77\n          ],\n          [\n            1578199192,\n            63.5659,\n            53.1379,\n            39,\n            11,\n            742.77\n          ]\n        ]\n      },\n      {\n        \"style\": \"style_40\",\n        \"points\": [\n          [\n            1578199192,\n            63.5659,\n            53.1379,\n            39,\n            11,\n            1800.23\n          ],\n          [\n            1578199320,\n            63.5797,\n            53.1518,\n            43,\n            30,\n            1800.23\n          ],\n          [\n            1578199513,\n            63.5941,\n            53.1667,\n            51,\n            25,\n            1921.08\n          ]\n        ]\n      }\n\n ```",
        "operationId": "fasttracks",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2021-05-03 00:00:00"
                  },
                  "to": {
                    "type": "string",
                    "example": "2021-05-24 00:00:00"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "350d511c-ed5f-424f-91f2-2b9259271ba6"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "350d511c-ed5f-424f-91f2-2b9259271ba6"
                      }
                    ]
                  },
                  "zoom": {
                    "type": "number",
                    "example": 14
                  }
                }
              },
              "examples": {
                "/fasttracks": {
                  "value": {
                    "from": "2021-05-03 00:00:00",
                    "to": "2021-05-24 00:00:00",
                    "units": [
                      {
                        "id": "350d511c-ed5f-424f-91f2-2b9259271ba6"
                      }
                    ],
                    "zoom": 14
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/box_tracks": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/box_tracks",
        "description": "**Запрос на получение трека в прямоугольной области карты**\n\n---\n\nЗапрос состоит из 2 параметров:\n\nprocess_id - уникальный идентификатор, полученный в ответе на запрос /fasttracks .\n\nbox - массив \\[latitude1, longitude1, latitude2, longitude2\\].\n\nlatitude1, longitude1 - координаты нижнего левого угла прямоугольника.\n\nlatitude2, longitude2 - координаты верхного правого угла прямоугольника.\n\nzoom - зумирование .\n\nОтвет имеет такую же структуру, как в запросе POST /fasttracks.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"process_id\": \"fed93e82-6c86-4cfd-bcf2-637bd3dfecaa\",\n    \"box\": [\n       55.775519, 37.934139, 55.956245, 38.342490\n    ],\n    \"zoom\": 18\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"columns\": [\n      {\n        \"key\": \"datepoint\",\n        \"value\": \"Дата\"\n      },\n      {\n        \"key\": \"longitude\",\n        \"value\": \"Широта\"\n      },\n      {\n        \"key\": \"latitude\",\n        \"value\": \"Долгота\"\n      },\n      {\n        \"key\": \"speed\",\n        \"value\": \"Скорость\"\n      },\n      {\n        \"key\": \"angle\",\n        \"value\": \"Угол\"\n      },\n      {\n        \"key\": \"distance\",\n        \"value\": \"Дистанция\"\n      }\n    ],\n    \"values\": [\n      {\n        \"style\": \"style_0\",\n        \"points\": [\n          [\n            1578131434,\n            63.5339,\n            53.1475,\n            0,\n            101,\n            0\n          ],\n          [\n            1578198784,\n            63.5347,\n            53.1472,\n            0,\n            159,\n            62.35\n          ],\n          [\n            1578198974,\n            63.5337,\n            53.1464,\n            17,\n            160,\n            118.67\n          ]\n        ]\n      },\n      {\n        \"style\": \"style_40\",\n        \"points\": [\n          [\n            1578198974,\n            63.5337,\n            53.1464,\n            17,\n            160,\n            1682.05\n          ],\n          [\n            1578199107,\n            63.5548,\n            53.1381,\n            51,\n            132,\n            1682.05\n          ]\n        ]\n      },\n      {\n        \"style\": \"style_0\",\n        \"points\": [\n          [\n            1578199107,\n            63.5548,\n            53.1381,\n            51,\n            132,\n            742.77\n          ],\n          [\n            1578199192,\n            63.5659,\n            53.1379,\n            39,\n            11,\n            742.77\n          ]\n        ]\n      },\n      {\n        \"style\": \"style_40\",\n        \"points\": [\n          [\n            1578199192,\n            63.5659,\n            53.1379,\n            39,\n            11,\n            1800.23\n          ],\n          [\n            1578199320,\n            63.5797,\n            53.1518,\n            43,\n            30,\n            1800.23\n          ],\n          [\n            1578199513,\n            63.5941,\n            53.1667,\n            51,\n            25,\n            1921.08\n          ]\n        ]\n      }\n\n ```",
        "operationId": "boxTracks",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "box": {
                    "type": "array",
                    "items": {
                      "type": "number",
                      "example": 55.775519
                    },
                    "example": [
                      55.775519,
                      37.934139,
                      55.956245,
                      38.34249
                    ]
                  },
                  "process_id": {
                    "type": "string",
                    "example": "fed93e82-6c86-4cfd-bcf2-637bd3dfecaa"
                  }
                }
              },
              "examples": {
                "/box_tracks": {
                  "value": {
                    "box": [
                      55.775519,
                      37.934139,
                      55.956245,
                      38.34249
                    ],
                    "process_id": "fed93e82-6c86-4cfd-bcf2-637bd3dfecaa"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/fasttracks_group": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/fasttracks_group",
        "description": "**Получение треков группы объектов**\n\n---\n\nСтроит треки для нескольких объектов или для групп объектов за период. Для каждого объекта возвращается отдельный трек со своим цветом.\n\nГрупповой трек — обзорный: он показывает только движение и прореживает точки тем сильнее, чем больше объектов в запросе. Подробный трек одного объекта со стоянками — `POST /fasttracks`.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Параметры:**\n- units: array - объекты, для которых строится трек. Обязательно, если не указан groups.\n  - id: string (UUID) - ID объекта. Обязательно.\n- groups: array - группы объектов, трек строится по всем объектам групп. Обязательно, если не указан units.\n  - id: string (UUID) - ID группы. Обязательно.\n- from: string - начало периода, формат `yyyy-mm-dd hh:mm:ss`, время компании. Обязательно.\n- to: string - конец периода, формат `yyyy-mm-dd hh:mm:ss`, время компании. Обязательно.\n- zoom: integer - масштаб карты, от 1 до 20. Обязательно. Используется для упрощения линии трека под масштаб.\n\nОграничения:\n- Учитываются только активные объекты, архивные исключаются.\n- Не больше 500 активных объектов. Если их больше, ответ 200, но все треки в нём пустые (см. «Ответ»).\n- На весь ответ отводится до 200 000 точек. Число точек на объект зависит от количества объектов N в запросе:\n\n| Объектов | 2–10 | 11–20 | 21–40 | 41–80 | 81–100 | 101–150 | 151–200 | 201–300 | 301–500 |\n|---|---|---|---|---|---|---|---|---|---|\n| Точек на объект, не больше | 20 000 | 10 000 | 5 000 | 2 500 | 2 000 | 1 333 | 1 000 | 666 | 500 |\n\n- В трек попадают только точки в движении, со скоростью от 3 км/ч. Стоянки не отображаются. Если объект весь период стоял, его трек пустой.\n- Если точек в движении больше лимита, они равномерно прореживаются по времени. Первая и последняя точки остаются всегда.\n- Готовый трек объекта хранится 5 минут. Повторный запрос с теми же параметрами в течение 5 минут вернёт сохранённый трек, новые точки за это время в нём не появятся.\n\n---\n\n**Пример запроса:**\nТрек группы объектов за сутки\n\n```\n{\n    \"groups\": [{\"id\": \"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\"}],\n    \"from\": \"2026-10-01 00:00:00\",\n    \"to\": \"2026-10-01 23:59:59\",\n    \"zoom\": 14\n}\n```\n\nТрек двух объектов\n\n```\n{\n    \"units\": [\n        {\"id\": \"b12345b2-6789-1ab2-3cd4-1ab234cd5e67\"},\n        {\"id\": \"c12345b2-6789-1ab2-3cd4-1ab234cd5e67\"}\n    ],\n    \"from\": \"2026-10-01 00:00:00\",\n    \"to\": \"2026-10-01 23:59:59\",\n    \"zoom\": 14\n}\n```\n\n---\n\n**Ответ:**\nКод 200. Массив треков, по одному на объект.\n\n- unit_id: string (UUID) - ID объекта.\n- unit_name: string - имя объекта.\n- color: string - цвет трека объекта, HEX.\n- process_id: string (UUID) - ID построения трека.\n- columns: array - названия полей точки. Индекс поля в columns совпадает с индексом значения в каждой точке.\n- values: array - отрезки трека. Трек делится на отрезки по градации скорости.\n  - style: string - служебное поле, всегда `style_0`. Для цвета не использовать.\n  - new_style_key: string - ключ стиля отрезка, цвет — в legenda.newStyles.\n  - points: array - точки отрезка, каждая — массив: время (unix, время компании), широта, долгота, скорость (км/ч), угол (градусы), расстояние от предыдущей точки (м). Последняя точка отрезка повторяется первой в следующем.\n- legenda: object - легенда градации скорости.\n  - title: string - заголовок легенды.\n  - newStyles: array - стили: key — ключ из new_style_key, hex — цвет, min и max — границы скорости, км/ч (max у последнего стиля — null).\n- sum_distance: number - не заполняется в групповом треке, всегда 0.\n- has_more_points: boolean - служебное поле.\n\n```\n[\n  {\n    \"unit_id\": \"b12345b2-6789-1ab2-3cd4-1ab234cd5e67\",\n    \"unit_name\": \"Объект 1\",\n    \"color\": \"#641e16\",\n    \"process_id\": \"d12345b2-6789-1ab2-3cd4-1ab234cd5e67\",\n    \"columns\": [\n      {\"key\": \"datepoint\", \"value\": \"Дата\"},\n      {\"key\": \"latitude\", \"value\": \"Широта\"},\n      {\"key\": \"longitude\", \"value\": \"Долгота\"},\n      {\"key\": \"speed\", \"value\": \"Скорость\"},\n      {\"key\": \"angle\", \"value\": \"Угол\"},\n      {\"key\": \"distance\", \"value\": \"Дистанция\"}\n    ],\n    \"values\": [\n      {\n        \"style\": \"style_0\",\n        \"new_style_key\": \"style_1\",\n        \"points\": [\n          [1759305600, 55.751244, 37.618423, 45, 101, 0.0],\n          [1759305630, 55.752011, 37.620104, 52, 98, 128.4]\n        ]\n      }\n    ],\n    \"legenda\": {\n      \"title\": \"Скорость (км/ч)\",\n      \"newStyles\": [\n        {\"key\": \"style_0\", \"hex\": \"#51AAEB\", \"min\": 0.0, \"max\": 40.0},\n        {\"key\": \"style_1\", \"hex\": \"#623F73\", \"min\": 40.0, \"max\": 80.0},\n        {\"key\": \"style_2\", \"hex\": \"#E37A3A\", \"min\": 80.0, \"max\": 120.0},\n        {\"key\": \"style_3\", \"hex\": \"#DD1E1E\", \"min\": 120.0, \"max\": null}\n      ]\n    },\n    \"sum_distance\": 0,\n    \"has_more_points\": false\n  }\n]\n```\n\nПустой трек: объект весь период стоял или по нему не удалось получить данные — `values: []`. Если в запросе больше 500 активных объектов, все элементы массива пустые и без unit_id и unit_name: `{\"columns\": [], \"values\": [], \"process_id\": null, \"color\": \"#641e16\", \"sum_distance\": 0, \"has_more_points\": false, \"legenda\": null}`.\n\nОшибки:\n- 400 — не указан from, to или zoom.\n- 422 — в запросе нет активных объектов; даты в неверном формате.",
        "operationId": "fasttracksGroup",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "from",
                  "to",
                  "zoom"
                ],
                "description": "Нужен units или groups.",
                "properties": {
                  "units": {
                    "type": "array",
                    "description": "Объекты, для которых строится трек. Обязательно, если не указан groups.",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "description": "ID объекта."
                        }
                      }
                    }
                  },
                  "groups": {
                    "type": "array",
                    "description": "Группы объектов, трек строится по всем объектам групп. Обязательно, если не указан units.",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "description": "ID группы."
                        }
                      }
                    }
                  },
                  "from": {
                    "type": "string",
                    "description": "Начало периода, `yyyy-mm-dd hh:mm:ss`, время компании.",
                    "example": "2026-10-01 00:00:00"
                  },
                  "to": {
                    "type": "string",
                    "description": "Конец периода, `yyyy-mm-dd hh:mm:ss`, время компании.",
                    "example": "2026-10-01 23:59:59"
                  },
                  "zoom": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20,
                    "description": "Масштаб карты, используется для упрощения линии трека.",
                    "example": 14
                  }
                }
              },
              "examples": {
                "Группа объектов": {
                  "value": {
                    "groups": [
                      {
                        "id": "a12345b2-6789-1ab2-3cd4-1ab234cd5e67"
                      }
                    ],
                    "from": "2026-10-01 00:00:00",
                    "to": "2026-10-01 23:59:59",
                    "zoom": 14
                  }
                },
                "Два объекта": {
                  "value": {
                    "units": [
                      {
                        "id": "b12345b2-6789-1ab2-3cd4-1ab234cd5e67"
                      },
                      {
                        "id": "c12345b2-6789-1ab2-3cd4-1ab234cd5e67"
                      }
                    ],
                    "from": "2026-10-01 00:00:00",
                    "to": "2026-10-01 23:59:59",
                    "zoom": 14
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Массив треков, по одному на объект. Пустой трек — `values: []`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "unit_id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "ID объекта. Нет у пустого трека, если в запросе больше 500 активных объектов."
                      },
                      "unit_name": {
                        "type": "string",
                        "description": "Имя объекта."
                      },
                      "color": {
                        "type": "string",
                        "description": "Цвет трека объекта, HEX.",
                        "example": "#641e16"
                      },
                      "process_id": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "uuid",
                        "description": "ID построения трека."
                      },
                      "columns": {
                        "type": "array",
                        "description": "Названия полей точки. Индекс поля в columns совпадает с индексом значения в точке.",
                        "items": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string"
                            },
                            "value": {
                              "type": "string"
                            }
                          }
                        }
                      },
                      "values": {
                        "type": "array",
                        "description": "Отрезки трека по градации скорости.",
                        "items": {
                          "type": "object",
                          "properties": {
                            "style": {
                              "type": "string",
                              "description": "Служебное поле, всегда `style_0`. Для цвета не использовать."
                            },
                            "new_style_key": {
                              "type": "string",
                              "description": "Ключ стиля отрезка, цвет — в legenda.newStyles."
                            },
                            "points": {
                              "type": "array",
                              "description": "Точки: время (unix, время компании), широта, долгота, скорость (км/ч), угол (градусы), расстояние от предыдущей точки (м). Последняя точка отрезка повторяется первой в следующем.",
                              "items": {
                                "type": "array",
                                "items": {
                                  "type": "number"
                                },
                                "minItems": 6,
                                "maxItems": 6
                              }
                            }
                          }
                        }
                      },
                      "legenda": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Легенда градации скорости.",
                        "properties": {
                          "title": {
                            "type": "string"
                          },
                          "newStyles": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "key": {
                                  "type": "string"
                                },
                                "hex": {
                                  "type": "string"
                                },
                                "min": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Нижняя граница скорости, км/ч."
                                },
                                "max": {
                                  "type": [
                                    "number",
                                    "null"
                                  ],
                                  "description": "Верхняя граница скорости, км/ч; null у последнего стиля."
                                }
                              }
                            }
                          }
                        }
                      },
                      "sum_distance": {
                        "type": "number",
                        "description": "В групповом треке не заполняется, всегда 0."
                      },
                      "has_more_points": {
                        "type": "boolean",
                        "description": "Служебное поле."
                      }
                    }
                  }
                },
                "example": [
                  {
                    "unit_id": "b12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                    "unit_name": "Объект 1",
                    "color": "#641e16",
                    "process_id": "d12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                    "columns": [
                      {
                        "key": "datepoint",
                        "value": "Дата"
                      },
                      {
                        "key": "latitude",
                        "value": "Широта"
                      },
                      {
                        "key": "longitude",
                        "value": "Долгота"
                      },
                      {
                        "key": "speed",
                        "value": "Скорость"
                      },
                      {
                        "key": "angle",
                        "value": "Угол"
                      },
                      {
                        "key": "distance",
                        "value": "Дистанция"
                      }
                    ],
                    "values": [
                      {
                        "style": "style_0",
                        "new_style_key": "style_1",
                        "points": [
                          [
                            1759305600,
                            55.751244,
                            37.618423,
                            45,
                            101,
                            0.0
                          ],
                          [
                            1759305630,
                            55.752011,
                            37.620104,
                            52,
                            98,
                            128.4
                          ]
                        ]
                      }
                    ],
                    "legenda": {
                      "title": "Скорость (км/ч)",
                      "newStyles": [
                        {
                          "key": "style_0",
                          "hex": "#51AAEB",
                          "min": 0.0,
                          "max": 40.0
                        },
                        {
                          "key": "style_1",
                          "hex": "#623F73",
                          "min": 40.0,
                          "max": 80.0
                        },
                        {
                          "key": "style_2",
                          "hex": "#E37A3A",
                          "min": 80.0,
                          "max": 120.0
                        },
                        {
                          "key": "style_3",
                          "hex": "#DD1E1E",
                          "min": 120.0,
                          "max": null
                        }
                      ]
                    },
                    "sum_distance": 0,
                    "has_more_points": false
                  }
                ]
              }
            }
          },
          "400": {
            "description": "Не указан from, to или zoom",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "В запросе нет активных объектов или даты в неверном формате",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/journal_index": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/datepoint",
        "description": "**Получение номера записи в журнале по искомой дате**\n\n---\n\nunits - объект.  \nfrom - начало интервала журнала.  \ndatepoint - искомая дата.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"units\": [\n        {\n            \"id\": \"97fba3d2-841b-43cd-911a-073b84ad5438\"\n        }\n    ],\n    \"from\": \"2022-12-16 00:00:00\",\n    \"datepoint\": \"2022-12-16 12:40:36\"\n}\n\n ```\n\n**Пример ответа:**\n\n```\n{\n    \"index\": 2006\n}\n\n ```",
        "operationId": "datepoint",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "datepoint": {
                    "type": "string",
                    "example": "2022-12-16 12:40:36"
                  },
                  "from": {
                    "type": "string",
                    "example": "2022-12-16 00:00:00"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "97fba3d2-841b-43cd-911a-073b84ad5438"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/datepoint": {
                  "value": {
                    "datepoint": "2022-12-16 12:40:36",
                    "from": "2022-12-16 00:00:00",
                    "units": [
                      {
                        "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/fasttracks_to_geozone": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/fasttracks_to_geozone",
        "description": "**Создание геозоны на основе трека объекта**\n\n---\n\nunits - id объекта, берется всегда ПЕРВЫЙ объект, передавать несколько объектов не имеет смысла.\n\nfrom - начало периода\n\nto - конец периода\n\ngeozone - все данные для создания геозоны, кроме точек (geometry). см. POST /geozones\n\nОтвет - Поля отправленные в geozone в запросе + geometry - координаты\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"units\": [\n        {\n            \"id\": \"194659d6-b51c-4da7-b3e0-a9fd0c08bd08\"\n        }\n    ],\n    \"geozone\": {\n        \"name\": \"Геозона\",\n        \"width\": 1,\n        \"type\": {\n            \"key\": \"polygon\",\n            \"type\": \"geozone_type\",\n            \"value\": \"Полигон\"\n        },\n        \"icon\": {\n            \"key\": \"territory\",\n            \"type\": \"geo_icon\",\n            \"value\": \"Территория\"\n        },\n        \"color\": {\n            \"key\": \"#E68A2F\",\n            \"type\": \"color_code\",\n            \"value\": \"Оранжевый\"\n        }\n    },\n    \"from\": \"2022-05-01 00:00:00\",\n    \"to\": \"2022-05-08 00:00:00\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"name\": \"Геозона\",\n    \"width\": 1,\n    \"type\": {\n        \"key\": \"polygon\",\n        \"type\": \"geozone_type\",\n        \"value\": \"Полигон\"\n    },\n    \"icon\": {\n        \"key\": \"territory\",\n        \"type\": \"geo_icon\",\n        \"value\": \"Территория\"\n    },\n    \"color\": {\n        \"key\": \"#E68A2F\",\n        \"type\": \"color_code\",\n        \"value\": \"Оранжевый\"\n    },\n    \"geometry\": [\n        [\n            58.477291107177734,\n            56.41659164428711\n        ],\n        [\n            58.477989196777344,\n            56.414066314697266\n        ],\n        [\n            58.478939056396484,\n            56.41456985473633\n        ],\n        [\n            58.47801971435547,\n            56.41176986694336\n        ],\n        [\n            58.47996139526367,\n            56.41171646118164\n        ],\n        [\n            58.49407196044922,\n            56.43291091918945\n        ],\n        [\n            58.455448150634766,\n            56.4921875\n        ],\n        [\n            58.44243621826172,\n            56.5400390625\n        ],\n        [\n            58.435298919677734,\n            56.54085922241211\n        ],\n        [\n            58.432525634765625,\n            56.539642333984375\n        ],\n        [\n            58.42418670654297,\n            56.52698516845703\n        ],\n        [\n            58.390262603759766,\n            56.50182342529297\n        ],\n        [\n            58.37371063232422,\n            56.48448944091797\n        ],\n        [\n            58.35701370239258,\n            56.47863006591797\n        ],\n        [\n            58.34515380859375,\n            56.46323013305664\n        ],\n        [\n            58.34355545043945,\n            56.44695281982422\n        ],\n        [\n            58.33879852294922,\n            56.43614959716797\n        ],\n        [\n            58.32884216308594,\n            56.43088912963867\n        ],\n        [\n            58.316139221191406,\n            56.43156814575195\n        ],\n        [\n            58.31150436401367,\n            56.42858123779297\n        ],\n        [\n            58.30974197387695,\n            56.42164611816406\n        ],\n        [\n            58.302207946777344,\n            56.417686462402344\n        ],\n        [\n            58.3018913269043,\n            56.41263961791992\n        ],\n        [\n            58.306488037109375,\n            56.40105056762695\n        ],\n        [\n            58.30192565917969,\n            56.412593841552734\n        ],\n        [\n            58.30179214477539,\n            56.41674041748047\n        ],\n        [\n            58.30784606933594,\n            56.42136764526367\n        ],\n        [\n            58.30413818359375,\n            56.43191146850586\n        ],\n        [\n            58.309669494628906,\n            56.4671516418457\n        ],\n        [\n            58.305442810058594,\n            56.47206115722656\n        ],\n        [\n            58.29851150512695,\n            56.47565841674805\n        ],\n        [\n            58.294681549072266,\n            56.481937408447266\n        ],\n        [\n            58.300418853759766,\n            56.484275817871094\n        ],\n        [\n            58.30851364135742,\n            56.48251724243164\n        ],\n        [\n            58.31448745727539,\n            56.46957015991211\n        ],\n        [\n            58.31837463378906,\n            56.46688461303711\n        ],\n        [\n            58.3328742980957,\n            56.47914123535156\n        ],\n        [\n            58.335201263427734,\n            56.47939682006836\n        ],\n        [\n            58.33803939819336,\n            56.47685623168945\n        ],\n        [\n            58.34174728393555,\n            56.467525482177734\n        ],\n        [\n            58.34584426879883,\n            56.46585464477539\n        ],\n        [\n            58.358394622802734,\n            56.47978973388672\n        ],\n        [\n            58.373939514160156,\n            56.48464584350586\n        ],\n        [\n            58.38987350463867,\n            56.50153350830078\n        ],\n        [\n            58.42338180541992,\n            56.52629089355469\n        ],\n        [\n            58.43311309814453,\n            56.54020309448242\n        ],\n        [\n            58.442684173583984,\n            56.540000915527344\n        ],\n        [\n            58.4559440612793,\n            56.49037551879883\n        ],\n        [\n            58.45564651489258,\n            56.43037414550781\n        ],\n        [\n            58.4511833190918,\n            56.422027587890625\n        ],\n        [\n            58.455528259277344,\n            56.43009567260742\n        ],\n        [\n            58.45490646362305,\n            56.43424987792969\n        ],\n        [\n            58.45737075805664,\n            56.4296989440918\n        ],\n        [\n            58.456932067871094,\n            56.42644119262695\n        ],\n        [\n            58.463802337646484,\n            56.39642333984375\n        ],\n        [\n            58.470794677734375,\n            56.39438247680664\n        ],\n        [\n            58.47585678100586,\n            56.407806396484375\n        ],\n        [\n            58.47556686401367,\n            56.40900802612305\n        ],\n        [\n            58.474639892578125,\n            56.40435028076172\n        ],\n        [\n            58.47453689575195,\n            56.409210205078125\n        ],\n        [\n            58.47787094116211,\n            56.41158676147461\n        ],\n        [\n            58.47735595703125,\n            56.416500091552734\n        ],\n        [\n            58.477962493896484,\n            56.41410446166992\n        ],\n        [\n            58.478851318359375,\n            56.41459655761719\n        ],\n        [\n            58.47584915161133,\n            56.409793853759766\n        ],\n        [\n            58.470985412597656,\n            56.39485168457031\n        ],\n        [\n            58.468772888183594,\n            56.39400100708008\n        ],\n        [\n            58.464168548583984,\n            56.395565032958984\n        ],\n        [\n            58.45691680908203,\n            56.42605972290039\n        ],\n        [\n            58.457672119140625,\n            56.42924118041992\n        ],\n        [\n            58.45512390136719,\n            56.434085845947266\n        ],\n        [\n            58.45643997192383,\n            56.467201232910156\n        ],\n        [\n            58.45261764526367,\n            56.464988708496094\n        ],\n        [\n            58.45439147949219,\n            56.46688461303711\n        ],\n        [\n            58.456478118896484,\n            56.466243743896484\n        ],\n        [\n            58.45513916015625,\n            56.43400955200195\n        ],\n        [\n            58.457672119140625,\n            56.428993225097656\n        ],\n        [\n            58.45687484741211,\n            56.426273345947266\n        ],\n        [\n            58.46389389038086,\n            56.396141052246094\n        ],\n        [\n            58.47080612182617,\n            56.39448928833008\n        ],\n        [\n            58.47549819946289,\n            56.40879821777344\n        ],\n        [\n            58.47584915161133,\n            56.407806396484375\n        ],\n        [\n            58.47478485107422,\n            56.40472412109375\n        ],\n        [\n            58.47456359863281,\n            56.409278869628906\n        ],\n        [\n            58.47783660888672,\n            56.41162872314453\n        ],\n        [\n            58.47768020629883,\n            56.41593933105469\n        ],\n        [\n            58.4779167175293,\n            56.411678314208984\n        ],\n        [\n            58.47163009643555,\n            56.410831451416016\n        ],\n        [\n            58.46517562866211,\n            56.41938018798828\n        ],\n        [\n            58.460968017578125,\n            56.4117431640625\n        ],\n        [\n            58.45635986328125,\n            56.43159484863281\n        ],\n        [\n            58.451236724853516,\n            56.4222526550293\n        ],\n        [\n            58.44839096069336,\n            56.42311477661133\n        ],\n        [\n            58.45040512084961,\n            56.42209243774414\n        ],\n        [\n            58.452735900878906,\n            56.42485809326172\n        ],\n        [\n            58.45558166503906,\n            56.43049240112305\n        ],\n        [\n            58.4548454284668,\n            56.434326171875\n        ],\n        [\n            58.45744323730469,\n            56.4295539855957\n        ],\n        [\n            58.45690155029297,\n            56.42661666870117\n        ],\n        [\n            58.460601806640625,\n            56.41170883178711\n        ],\n        [\n            58.464805603027344,\n            56.4195442199707\n        ],\n        [\n            58.47134780883789,\n            56.41114044189453\n        ],\n        [\n            58.47795486450195,\n            56.41222381591797\n        ],\n        [\n            58.47724914550781,\n            56.4166259765625\n        ]\n    ]\n}\n\n ```",
        "operationId": "fasttracksToGeozone",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2022-05-01 00:00:00"
                  },
                  "geozone": {
                    "type": "object",
                    "properties": {
                      "color": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "example": "#E68A2F"
                          },
                          "type": {
                            "type": "string",
                            "example": "color_code"
                          },
                          "value": {
                            "type": "string",
                            "example": "Оранжевый"
                          }
                        }
                      },
                      "icon": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "example": "territory"
                          },
                          "type": {
                            "type": "string",
                            "example": "geo_icon"
                          },
                          "value": {
                            "type": "string",
                            "example": "Территория"
                          }
                        }
                      },
                      "name": {
                        "type": "string",
                        "example": "Геозона"
                      },
                      "type": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "example": "polygon"
                          },
                          "type": {
                            "type": "string",
                            "example": "geozone_type"
                          },
                          "value": {
                            "type": "string",
                            "example": "Полигон"
                          }
                        }
                      },
                      "width": {
                        "type": "number",
                        "example": 1
                      }
                    }
                  },
                  "to": {
                    "type": "string",
                    "example": "2022-05-08 00:00:00"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "194659d6-b51c-4da7-b3e0-a9fd0c08bd08"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "194659d6-b51c-4da7-b3e0-a9fd0c08bd08"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/fasttracks_to_geozone": {
                  "value": {
                    "from": "2022-05-01 00:00:00",
                    "geozone": {
                      "color": {
                        "key": "#E68A2F",
                        "type": "color_code",
                        "value": "Оранжевый"
                      },
                      "icon": {
                        "key": "territory",
                        "type": "geo_icon",
                        "value": "Территория"
                      },
                      "name": "Геозона",
                      "type": {
                        "key": "polygon",
                        "type": "geozone_type",
                        "value": "Полигон"
                      },
                      "width": 1
                    },
                    "to": "2022-05-08 00:00:00",
                    "units": [
                      {
                        "id": "194659d6-b51c-4da7-b3e0-a9fd0c08bd08"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/tracks/get_tracks": {
      "get": {
        "tags": [
          "Треки"
        ],
        "summary": "/tracks/get_tracks",
        "description": "**Запрос для получения трека**\n\nТело запроса JSON\n\n---\n\nПоля запроса :\n\nunit_id - ID объекта\n\nfrom - начало периода, в формате yyyy-MM-dd HH:mm:ss, необходимо отправлять в UTC+0\n\nto - конеч периода, в формате yyyy-MM-dd HH:mm:ss, необходимо отправлять в UTC+0\n\nmin_lat - Минимальное значение широты, вещественное число\n\nmax_lat - Максимальное значение широты, вещественное число\n\nmin_lon - Минимальное значение долготы, вещественное число\n\nmax_lon - Максимальное значение долготы, вещественное число\n\nzoom - зум, целое число\n\nprocess_id - опциональное поле, для указания идентификатор запроса на клиенте\n\nНа странице локатора дополнительно отправить параметр locator_id - ID локатора\n\n---\n\n**Пример запроса:**\n\nGET [https://api.skif.pro/api_v1/tracks/get_tracks](https://api.skif.pro/api_v1/tracks/get_tracks?unit_id=93a62a79-a117-4b4e-b53a-568e1d06e603&from=2023-10-01)\n\n```\n{\n    \"unit_id\": \"93a62a79-a117-4b4e-b53a-568e1d06e603\",\n    \"from\": \"2023-10-01 00:00:00\",\n    \"to\": \"2024-12-01 00:00:00\",\n    \"min_lat\": 34.323233,\n    \"min_lon\": 20.343545,\n    \"max_lat\": 80.34324,\n    \"max_lon\": 88.32321,\n    \"zoom\": 10,\n    \"process_id\": \"4c658ab8-2ef6-460c-aee2-ecc4a1486df8\"\n}\n\n ```\n\n**Ответ:**\n\nКаждый элемент массива points в таком формате: \\[datepoint_delta,latitude,longitude,speed\\]\n\ndatepoint_delta - разница datepoint от предыдущей записи в секундах. Для первого элемента это разница от from. datepoint в unix timestamp.\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"points\": [\n        [\n            17140501,\n            59.959656,\n            30.311783,\n            16\n        ],\n        [\n            222,\n            59.956139,\n            30.320679,\n            45\n        ],\n        [\n            244,\n            59.950233,\n            30.326031,\n            13\n        ]\n    ],\n    \"process_id\": \"4c658ab8-2ef6-460c-aee2-ecc4a1486df8\"\n}\n\n ```",
        "operationId": "tracksGetTracks",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/notifications": {
      "get": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/notifications?ids=:ids",
        "description": "**Получение шаблона уведомления**\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "notificationsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/notifications",
        "description": "**Создание нового шаблона уведомлений**\n\n---\n\nМодель шаблона:\n\n```\n    Unit[] units - обязательный параметр. Должен быть хотя бы один юнит.\n    units_groups[] units_groups - Новый параметр для уведомлений по группе объектов\n    Dictionary type - виды уведомлений - Контроль скорости, Контроль геозон, Контроль значения датчика, Тревожная кнопка, Потеря связи, Простой ТС, Контроль ТО. Ключи можно получить через запрос GET /dictionaries/notification_type\n    Dictionary sound - Звук, Ключи можно получить через запрос GET /dictionaries,  тип - notify_sounds\n    String[] delivery_emails - массив строк с емейлами\n    String[] delivery_sms - массив строк с телефонами\n    UUID[] delivery_push - массив uuid юзеров\n    Long[] delivery_telegram - массив id-рассылки для Telegram. Массив целых чисел. Выбирается из пользователей из поля telegram_chat_id\n    В запросе должен быть хотя бы один из этих 4 параметров.\n    List<DeliveryCommand> delivery_commands - массив настройки для отправки команды, каждый элемент\n       состоит из полей terminal_type_key - ключ тип протокола, command - текст команды.\n    List<DeliveryHttpRequest> delivery_http_requests - массив настройки для отправки GET/POST запросов\n    UUID[] delivery_add_unit_group - массив UUID групп объектов для \"Добавление объекта в группы\"\n    UUID[] delivery_remove_unit_from_group -  UUID групп объектов для \"Удаление объекта из группы\"\n    Dictionary delivery_unit_icon - изменение иконки объекта\n    String name - имя шаблона. Обязательный параметр.\n    Boolean is_active; //деактивация\n    String notificationtext - шаблон текста уведомления. Обязательный параметр.\n    Boolean is_show_online; // включить показать онлайн\n    Boolean isdeliveryemail; // включить отправку на почту\n    Boolean isdeliverysms; // включить отправку sms\n    Boolean isdeliverypush; //включить отправку push\n    Boolean isdeliverytelegram; //включить отправку на телеграм\n    Boolean isdeliverycommand; // включить отправку команды\n    Boolean isdeliveryhttp; // включить отправку GET/POST\n    Boolean isdeliveryaddtogroup; // включить добавление объекта из группы\n    Boolean isdeliveryremovefromgroup; // включить удаление объекта из группы\n    Boolean isdeliverychangeicon; // включить изменение иконки объекта\nBoolean isviolation;\n    Boolean isevent;\n    Boolean weeks_control; //контроль по дням недели\n    Boolean wc_active_1; //monday\n    Boolean wc_active_2;\n    Boolean wc_active_3;\n    Boolean wc_active_4;\n    Boolean wc_active_5;\n    Boolean wc_active_6;\n    Boolean wc_active_7;\n    String wc_from_1; //from for monday\n    String wc_from_2;\n    String wc_from_3;\n    String wc_from_4;\n    String wc_from_5;\n    String wc_from_6;\n    String wc_from_7;\n    String wc_to_1; //to for monday\n    String wc_to_2;\n    String wc_to_3;\n    String wc_to_4;\n    String wc_to_5;\n    String wc_to_6;\n    String wc_to_7;\n    Geozones[] geozones - массив геозон. Должна быть хотя бы одна геозона в массиве, если type = 'geozone_notification' или 'velocity_notification'.\n    GeozonesGroup[] geozones_groups - массив групп геозон.\n    Dictionary sensor_type - ключ типа сенсора. Список типов может быть получен по запросу GET /dictionaries/sensor_type\n    String name_mask - маска имени сенсора.\n    В случае, если type = 'sensor_notification', то должен быть заполнен хотя бы один из этих 2 параметров.\n    Boolean in_geozone - тип триггера для геозон. false - выход из геозоны, true - вход в геозону. Является обязательным, если type = 'geozone_notification'.\n    Boolean in_interval - тип триггера для датчика. false - вне установленных рамок, true - в установленных рамках.  Является обязательным, если type = 'sensor_notification'.\n    Double speed_notless - скорость \"не менее\". Параметр используется только если type = 'velocity_notification'\n    Double speed_notmore - скорость \"не более\". Параметр используется только если type = 'velocity_notification' или 'idle_notification'.\n    Если type = 'velocity_notification', то должен быть заполнен хотя бы 1 параметр из этих двух.\n    Double sensor_notless - значение датчика \"не менее\". Параметр используется только если type = 'sensor_notification'\n    Double sensor_notmore - значение датчика \"не более\". Параметр используется только если type = 'sensor_notification'\n    Если type = 'sensor_notification', то должен быть заполнен хотя бы 1 параметр из этих двух.\n    Double lostsignal_notless - минимальное время потери сигнала. Параметр используется только если type = 'sensor_notification' и в этом случае является обязательным.\n    Integer duration - Длительность простоя. Используется только если type = 'idle_notification' и в таком случае является обязательным.\n    Также, если type = 'idle_notification', то параметр speed_notmore является обязательным.\n    Integer interval_milage - интервал пробега. Используется только если type = 'service_notification'.\n    Integer interval_days - интервал по дням. Используется только если type = 'service_notification'.\n    Integer interval_motohours - интервал моточасы\nИспользуется только если type = 'service_notification'.\n    Если type = 'service_notification', то должен быть заполнен хотя бы 1 параметр из этих трех.\n    Dictionary timeout_conditions_type - Виды таймаута проверки условия. Возможные ключи: timeout_conditions_sec, timeout_conditions_min, timeout_conditions_hour\n    Integer timeout_conditions_value - Значение таймаута проверки условия.\n\n ```\n\n---\n\n**Роль:** Оператор и выше.",
        "operationId": "notifications",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/notifications": {
                  "value": "{\n\t\"units\":[{\"id\":\"7e078c26-3043-4117-a822-54b29785c086\"},{\"id\":\"4b8f9e89-cc66-43b4-bafe-bf08fac8b211\"}],\n    \"units_groups\": [{\"id\":\"266b1737-e85f-4ba0-9985-dbeefa2dd697\"}],\n\t\"type\":{\"key\":\"sensor_notification\"},\n    \"sound\":{\"key\":\"8tone\"},\n\t\"delivery_emails\":[\"test1@mail.uk\",\"test2@mail.uk2\"],\n\t\"delivery_sms\":[\"12345644848\",\"12345644849\"],\n\t\"delivery_push\":[\"990cb3e1-474a-4f07-95b9-8568c194d801\",\"b1fd9628-9f72-4e72-9da8-f5ca4e2fffc1\"],\n    \"delivery_commands\": [\n        {\n            \"terminal_type_key\": \"navtelecom\",\n            \"command\": \"*?V\"\n        },\n        {\n            \"terminal_type_key\": \"galileo\",\n            \"command\": \"Info\"\n        }\n    ],\n    \"delivery_http_requests\" : [\n        {\n            \"url\": \"http://example.com\",\n            \"method\" : \"post\",\n            \"jsonBody\" : \"{ 'invalid syntax': 'json' }\", // в этом примере возвращается ошибка. нужно отправить { \"valid syntax\": \"json\" }\n            \"headers\": [\n                {\n                    \"name\" : \"headerName\",\n                    \"value\": \"headerValue\"\n                }\n            ]\n        }\n\n    ],\n    \"timeout_conditions_type\": {\n        \"key\": \"timeout_conditions_min\"\n    },\n    \"timeout_conditions_value\": 1,\n\t\"name\":\"testNotification\",\n\t\"is_active\":true,\n\t\"notificationtext\":\"some text\",\n\t\"is_show_online\": true,\n\t\"isdeliveryemail\": true,\n    \"isdeliverysms\": true,\n    \"isdeliverypush\": true,\n    \"isdeliverycommand\": true,\n    \"isviolation\": false,\n    \"isdeliveryhttp\": true,\n    \"isevent\": true,\n    \n    \"weeks_control\": true,\n    \"wc_active_1\":true,\n    \"wc_from_1\": 4124,\n    \"wc_to_1\": 4200,\n    \n\t\"geozones\":[{\"id\":\"79883ab2-968a-405d-839e-fad90e92a3d0\"},{\"id\":\"266b1737-e85f-4ba0-9985-dbeefa2dd697\"}],\n\t\"sensor_type\":{\"key\":\"ignition\"},\n\t\"name_mask\": \"CustomFuelSenso\",\n\t\"in_geozone\": true,\n\t\"in_interval\": false,\n\t\"speed_notless\": 12.0,\n\t\"speed_notmore\": 15.0,\n\t\"sensor_notless\": 333.0,\n\t\"sensor_notmore\": 555.0,\n\t\"duration\": 10,\n\t\"interval_milage\": 34000,\n\t\"interval_days\": 90,\n    \n    \"isdeliveryaddtogroup\": true,\n    \"isdeliveryremovefromgroup\" : true,\n    \"delivery_add_unit_group\": [\"9fd6f8d7-0d9a-4a8a-93f7-a2b0c28fcee4\"],\n    \"delivery_remove_unit_from_group\": [\"9fd6f8d7-0d9a-4a8a-93f7-a2b0c28fcee4\"]\n\n}"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/notifications?ids=:ids",
        "description": "**Планирование удаления шаблона уведомления**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Оператор и выше.",
        "operationId": "notificationsIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/notifications": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/notifications/{notification_id}": {
      "put": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/notifications/:notification_id",
        "description": "---\n\n**Роль:** Оператор и выше.",
        "operationId": "notificationsNotificationId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "notification_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор правила уведомления (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "27379574-a367-4864-a2de-b236aa22dbd4"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/notifications/:notification_id",
        "description": "**Удаление шаблона уведомлений**\n\n---\n\nУдаление физическое.\n\n---\n\n**Роль:** Оператор и выше.",
        "operationId": "notificationsNotificationId2",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "notification_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор правила уведомления (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "27379574-a367-4864-a2de-b236aa22dbd4"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "patch": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/notifications/:notification_id",
        "description": "**Изменение активности уведомлений**\n\n---\n\nПараметры:  \nnotification_id - ID уведомления\n\nТело запроса:  \nЧтобы сделать активным, необходимо отправить запрос с таким телом:\n\n```\n{\n    \"is_active\": true\n}\nили\n{\n    \"is_active\": \"true\"\n}\nили\n{\n    \"is_active\": 1\n}\n\n ```\n\nЧтобы сделать неактивным, необходимо отправить запрос с таким телом:\n\n```\n{\n    \"is_active\": false\n}\nили\n{\n    \"is_active\": \"false\"\n}\nили\n{\n    \"is_active\": 0\n}\n\n ```\n\nВ ответе возвращается обновленный объект notification , как в PUT /notifications/:notification_id\n\n---\n\n**Роль:** Оператор и выше.",
        "operationId": "notificationsNotificationId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "is_active": {
                    "type": "string",
                    "example": "false"
                  }
                }
              },
              "examples": {
                "/notifications/:notification_id": {
                  "value": {
                    "is_active": "false"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "notification_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор правила уведомления (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "27379574-a367-4864-a2de-b236aa22dbd4"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "notification_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID уведомления"
        }
      ]
    },
    "/api_v1/notifications/list": {
      "post": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/notifications/list",
        "description": "---\n\n**Роль:** Читатель и выше.",
        "operationId": "notificationsList",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/notifications/messages": {
      "get": {
        "tags": [
          "Уведомления"
        ],
        "summary": "/messages",
        "description": "**Получение уведомлений**\n\n---\n\nИспользуется один вебсокет для получения следующих данных:\n\n1. последнего сообщения от объекта\n\n2. уведомлений за последние сутки\n\n3. новых уведомлений\n\n4. изменения справочников\n\n\nПосле открытия сокета сервер будет присылать уведомления вида:\n\n```\n[{\n    \"id\": \"27379574-a367-4864-a2de-b236aa22dbd4\",\n    \"template\": {},\n    \"notificationtext\": \"Камаз А123АА777 в 2026-09-26 15:49:00 зафиксирован вход в геозону / выход из геозоны ... на скорости 10 возле Нефтебаза. \",\n    \"time\": \"2020-07-21 15:49:00\",\n    \"unit\": {},\n    \"latitude\": 53.2038766,\n    \"longitude\": 63.583665\n}]\n\n ```",
        "operationId": "messages1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/mailings": {
      "get": {
        "tags": [
          "Рассылки"
        ],
        "summary": "/mailings?ids=:ids",
        "description": "**Получение рассылок по их ID (через запятую)**\n\n---\n\nВозвращает массив рассылок.  \nЕсли параметр 'ids' пустой (т.е. запрос = 'GET /units_trailers', без параметра), то вернётся список всех связей всех компаний пользователя, из которого исключаются удаленные связей. Если ids не пустой (т.е. запрос = 'GET /mailings?ids=00215-54021..,25541-454754-4513..'), то вернётся список только из запрошенных связей.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретная связь.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n/mailings?ids=13b37095-f2eb-4c3f-804b-6f780281e398\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"13b37095-f2eb-4c3f-804b-6f780281e398\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"name\": \"New mailing\",\n    \"units_group\": {\n        \"id\": \"09581d93-a351-44de-9f33-1d4b0a1b0b48\"\n    },\n    \"report_template\": {\n        \"id\": \"76c4d2a4-5c89-494d-9c26-fbfcfa144601\"\n    },\n    \"periodic\": 2,\n    \"periodic_type\": {\n        \"key\": \"periodic_days\",\n        \"type\": \"periodic_type\",\n        \"value\": \"По дням\"\n    },\n    \"weekdays\": [\n        {\n            \"key\": \"monday\",\n            \"type\": \"weekdays_type\",\n            \"value\": \"Понедельник\"\n        },\n        {\n            \"key\": \"friday\",\n            \"type\": \"weekdays_type\",\n            \"value\": \"Пятница\"\n        }\n    ],\n    \"delivery_emails\": [\n        \"test@mail.ru\",\n        \"xyz@gmail.com\"\n    ],\n    \"last_run\": \"2020-10-05 10:25:45\",\n    \"msg\": \"Some message\",\n    \"is_active\": false,\n    \"_active\": false\n}\n\n ```",
        "operationId": "mailingsIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Рассылки"
        ],
        "summary": "/mailings",
        "description": "**Создание новой рассылки**\n\n---\n\nМодель рассылки:\n\n```\n    name - название рассылки, строка, обязательно\n    Unit unit - объект\n    UnitsGroup units_group - группа объектов, в одно и той же время надо указать или unit или units_group\n    ReportTemplate report_template - шаблон отчета, обязательно\n    periodic - период отправки письма, целое положительное число, обязательно\n    periodic_type - тип периода отправки, получается из справочника по типу periodic_type, обязательно\n    weekdays - список дней недели, в которых надо отправить письмо, обязательно\n    delivery_emails - список почт\n    delivery_telegram - список телеграм чатов\n    last_run - дата и время последней отправки, необязательно\n    msg - сообщение, текст\n    is_active - признак активности, булеан\n\n ```\n\n---\n\n**Роль:** Редактор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"name\": \"New mailing\",\n    \"unit\": {\n        \"id\": \"b8b1f330-52cf-46c6-a41e-ab0f70a0cce5\"\n    },\n    \"report_template\": {\n        \"id\": \"76c4d2a4-5c89-494d-9c26-fbfcfa144601\"\n    },\n    \"periodic\": 2,\n    \"periodic_type\": {\n        \"type\": \"periodic_type\",\n        \"key\": \"periodic_days\"\n    },\n    \"weekdays\": [\n        {\n            \"type\": \"weekdays_type\",\n            \"key\": \"monday\"\n        },\n        {\n            \"type\": \"weekdays_type\",\n            \"key\": \"friday\"\n        }\n    ],\n    \"delivery_emails\": [\n        \"test@mail.ru\",\n        \"xyz@gmail.com\"\n    ],\n    \"delivery_telegram\": [\n        484392478323,\n        -13894857843\n    ],\n    \"last_run\": \"2020-10-05 10:25:45\",\n    \"msg\": \"Some message\",\n    \"is_active\": true\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"id\": \"afa8dc0f-4e8f-422d-9059-2fedb9039f4e\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"unit\": {\n        \"id\": \"b8b1f330-52cf-46c6-a41e-ab0f70a0cce5\"\n    },\n    \"report_template\": {\n        \"id\": \"76c4d2a4-5c89-494d-9c26-fbfcfa144601\"\n    },\n    \"periodic\": 2,\n    \"periodic_type\": {\n        \"key\": \"periodic_days\",\n        \"type\": \"periodic_type\",\n        \"value\": \"По дням\"\n    },\n    \"weekdays\": [\n        {\n            \"key\": \"monday\",\n            \"type\": \"weekdays_type\",\n            \"value\": \"Понедельник\"\n        },\n        {\n            \"key\": \"friday\",\n            \"type\": \"weekdays_type\",\n            \"value\": \"Пятница\"\n        }\n    ],\n    \"delivery_emails\": [\n        \"test@mail.ru\",\n        \"xyz@gmail.com\"\n    ],\n     \"delivery_telegram\": [\n        484392478323,\n        -13894857843\n    ],\n    \"last_run\": \"2020-10-05 10:25:45\",\n    \"msg\": \"Some message\",\n    \"is_active\": true,\n    \"_active\": true\n}\n\n ```\n\n---\n\n**Запрос по группе объектов:**\n\n```\n{\n    \"name\": \"New mailing\",\n    \"units_group\": {\n        \"id\": \"09581d93-a351-44de-9f33-1d4b0a1b0b48\"\n    },\n    \"report_template\": {\n        \"id\": \"76c4d2a4-5c89-494d-9c26-fbfcfa144601\"\n    },\n    \"periodic\": 2,\n    \"periodic_type\": {\n        \"type\": \"periodic_type\",\n        \"key\": \"periodic_days\"\n    },\n    \"weekdays\": [\n        {\n            \"type\": \"weekdays_type\",\n            \"key\": \"monday\"\n        },\n        {\n            \"type\": \"weekdays_type\",\n            \"key\": \"friday\"\n        }\n    ],\n    \"delivery_emails\": [\n        \"test@mail.ru\",\n        \"xyz@gmail.com\"\n    ],\n     \"delivery_telegram\": [\n        484392478323,\n        -13894857843\n    ],\n    \"last_run\": \"2020-10-05 10:25:45\",\n    \"msg\": \"Some message\",\n    \"is_active\": true\n}\n\n ```",
        "operationId": "mailings",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "delivery_emails": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "test@mail.ru"
                    },
                    "example": [
                      "test@mail.ru",
                      "xyz@gmail.com"
                    ]
                  },
                  "is_active": {
                    "type": "boolean",
                    "example": true
                  },
                  "last_run": {
                    "type": "string",
                    "example": "2020-10-05 10:25:45"
                  },
                  "msg": {
                    "type": "string",
                    "example": "Some message"
                  },
                  "periodic": {
                    "type": "number",
                    "example": 2
                  },
                  "periodic_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "periodic_days"
                      },
                      "type": {
                        "type": "string",
                        "example": "periodic_type"
                      }
                    }
                  },
                  "report_template": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "76c4d2a4-5c89-494d-9c26-fbfcfa144601"
                      }
                    }
                  },
                  "units_group": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "09581d93-a351-44de-9f33-1d4b0a1b0b48"
                      }
                    }
                  },
                  "weekdays": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "monday"
                        },
                        "type": {
                          "type": "string",
                          "example": "weekdays_type"
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "monday",
                        "type": "weekdays_type"
                      },
                      {
                        "key": "friday",
                        "type": "weekdays_type"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/mailings": {
                  "value": {
                    "delivery_emails": [
                      "test@mail.ru",
                      "xyz@gmail.com"
                    ],
                    "is_active": true,
                    "last_run": "2020-10-05 10:25:45",
                    "msg": "Some message",
                    "periodic": 2,
                    "periodic_type": {
                      "key": "periodic_days",
                      "type": "periodic_type"
                    },
                    "report_template": {
                      "id": "76c4d2a4-5c89-494d-9c26-fbfcfa144601"
                    },
                    "units_group": {
                      "id": "09581d93-a351-44de-9f33-1d4b0a1b0b48"
                    },
                    "weekdays": [
                      {
                        "key": "monday",
                        "type": "weekdays_type"
                      },
                      {
                        "key": "friday",
                        "type": "weekdays_type"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Рассылки"
        ],
        "summary": "/mailings?ids=:ids",
        "description": "**Планирование удаление рассылки**\n\n---\n\nсм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "mailingsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/mailings": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/mailings/{id}": {
      "delete": {
        "tags": [
          "Рассылки"
        ],
        "summary": "/mailings/:id",
        "description": "**Удаление рассылки**\n\n---\n\nУдаление физическое.\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "mailingsId2",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "patch": {
        "tags": [
          "Рассылки"
        ],
        "summary": "/mailings/:id",
        "description": "**Изменение активности рассылки**\n\n---\n\nПараметры:  \nid - ID рассылки\n\n\nЧтобы сделать активным, необходимо отправить запрос с таким телом:\n\n```\n{\n    \"is_active\": true\n}\nили\n{\n    \"is_active\": \"true\"\n}\nили\n{\n    \"is_active\": 1\n}\n\n ```\n\nЧтобы сделать неактивным, необходимо отправить запрос с таким телом:\n\n```\n{\n    \"is_active\": false\n}\nили\n{\n    \"is_active\": \"false\"\n}\nили\n{\n    \"is_active\": 0\n}\n\n ```\n\nВ ответе возвращается обновленный объект mailing как в PUT /mailings/:id",
        "operationId": "mailingsId",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "is_active": {
                    "type": "string",
                    "example": "false"
                  }
                }
              },
              "examples": {
                "/mailings/:id": {
                  "value": {
                    "is_active": "false"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID рассылки"
        }
      ],
      "put": {
        "tags": [
          "Рассылки"
        ],
        "summary": "Обновление параметров рассылки",
        "description": "Обновление настроек автоматической рассылки отчетов (периодичность, получатели, шаблоны отчетов).",
        "operationId": "mailingsId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/mailings/list": {
      "post": {
        "tags": [
          "Рассылки"
        ],
        "summary": "/mailings/list",
        "description": "**Получить рассылки по фильтру**\n\n---\n\nАналогичнао запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[\"periodic\", \"last_run\", created, is_delete\\]\n\nsortDesc - сортировка по убыванию, значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - \"units_group.id\", \"unit.id\", \"is_active\", \"msg\"\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\nПолучить первые 10 связей, отсортированные по возрастанию даты создания объект с ID равным b8b1f330-52cf-46c6-a41e-ab0f70a0cce5\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"conditions\": [\n        {\n            \"field\": \"unit.id\",\n            \"value\": \"b8b1f330-52cf-46c6-a41e-ab0f70a0cce5\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"afa8dc0f-4e8f-422d-9059-2fedb9039f4e\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"name\": \"New mailing\",\n            \"unit\": {\n                \"id\": \"b8b1f330-52cf-46c6-a41e-ab0f70a0cce5\"\n            },\n            \"report_template\": {\n                \"id\": \"76c4d2a4-5c89-494d-9c26-fbfcfa144601\"\n            },\n            \"periodic\": 2,\n            \"periodic_type\": {\n                \"key\": \"periodic_days\",\n                \"type\": null,\n                \"value\": null\n            },\n            \"weekdays\": [],\n            \"delivery_emails\": [\n                \"test@mail.ru\",\n                \"xyz@gmail.com\"\n            ],\n            \"last_run\": \"2020-10-05 10:25:45\",\n            \"msg\": \"Some message\",\n            \"is_active\": true,\n            \"_active\": true\n        },\n        {\n            \"id\": \"13b37095-f2eb-4c3f-804b-6f780281e398\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"name\": \"New mailing2\",\n            \"units_group\": {\n                \"id\": \"09581d93-a351-44de-9f33-1d4b0a1b0b48\"\n            },\n            \"report_template\": {\n                \"id\": \"76c4d2a4-5c89-494d-9c26-fbfcfa144601\"\n            },\n            \"periodic\": 2,\n            \"periodic_type\": {\n                \"key\": \"periodic_days\",\n                \"type\": null,\n                \"value\": null\n            },\n            \"weekdays\": [],\n            \"delivery_emails\": [\n                \"test@mail.ru\",\n                \"xyz@gmail.com\"\n            ],\n            \"last_run\": \"2020-10-05 10:25:45\",\n            \"msg\": \"Some message\",\n            \"is_active\": false,\n            \"_active\": false\n        }\n    ]\n}\n\n ```\n\nЕще один пример запроса:\n\nПолучить первые 10 связей, отсортированные по возрастанию даты окончания по убыванию, связаные с водителем (пользователем) с ID 22ae4a3c-f742-460c-9479-63f08c81b5c3\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"sortField\": \"date_to\",\n    \"sortDesc\": \"true\",\n    \"conditions\": [\n        {\n            \"field\": \"user.id\",\n            \"value\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 3,\n    \"list\": [\n        {\n            \"id\": \"f9c60641-0393-4345-aa2a-aadb869db3c9\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"cc1c4c33-5895-4fec-9295-020ffcee9372\"\n            },\n            \"user\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2021-01-01 10:00:00\"\n        },\n        {\n            \"id\": \"d604452b-9e9d-4e01-817d-b0d391138569\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"7e1aaba2-625a-4a4c-b765-9934bec5a096\"\n            },\n            \"user\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-11-01 10:00:00\",\n            \"date_to\": \"2020-12-01 18:00:00\"\n        },\n        {\n            \"id\": \"5acc2fd1-e63a-4c10-95d0-22eaf59439ae\",\n            \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n            \"unit\": {\n                \"id\": \"cc1c4c33-5895-4fec-9295-020ffcee9372\"\n            },\n            \"user\": {\n                \"id\": \"22ae4a3c-f742-460c-9479-63f08c81b5c3\"\n            },\n            \"date_from\": \"2020-09-01 10:00:00\",\n            \"date_to\": \"2020-10-01 18:00:00\"\n        }\n    ]\n}\n\n ```",
        "operationId": "mailingsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "unit.id"
                        },
                        "value": {
                          "type": "string",
                          "example": "b8b1f330-52cf-46c6-a41e-ab0f70a0cce5"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "unit.id",
                        "value": "b8b1f330-52cf-46c6-a41e-ab0f70a0cce5"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 10
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  }
                }
              },
              "examples": {
                "/mailings/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "unit.id",
                        "value": "b8b1f330-52cf-46c6-a41e-ab0f70a0cce5"
                      }
                    ],
                    "count": 10,
                    "from": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/bill_create_order": {
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Создание заказа на пополнение баланса",
        "description": "**Запрос на получение данных для оплаты текущей компании на сумму, указанную в теле запроса**\n\n---\n\n**Пример запроса:**\n\n```\n{\n  \"amount\": 300,\n  \"skip_init_payment\": true\n}\n\n ```\n\nЧтобы начать автоплатеж нужно указать start_recurrent=1\n\n```\n{\n  \"amount\": 300,\n  \"start_recurrent\": 1,\n  \"skip_init_payment\": true\n}\n\n ```\n\nВ ответ приходят данные, которые необходимо преобразовать в формат _**www-form-urlencoded**_ и отправить запрос\n\n> POST\n\n\nв ответ на который вернется страница с формой для оплаты.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"merchant\": \"60ddcdb9-a37a-438b-8a43-ba9e04400aff\",\n    \"amount\": 150,\n    \"order_id\": \"7f6e0b1e-4874-426e-849e-a47ff2cf4aba\",\n    \"custom_order_id\": \"297-7ee49\",\n    \"description\": \"Пополнение кошелька SKIF PRO\",\n    \"success_url\": \"https://pay.modulbank.ru/success\",\n    \"testing\": 1,\n    \"callback_url\": \"https://dev.skif.pro/api_v1/billing_success\",\n    \"receipt_items\": [\n        {\n            \"name\": \"Пополнение кошелька SKIF PRO\",\n            \"payment_method\": \"full_payment\",\n            \"payment_object\": \"payment\",\n            \"quantity\": \"1\",\n            \"sno\": \"usn_income\",\n            \"vat\": \"none\"\n        }\n    ],\n    \"unix_timestamp\": 1627568279,\n    \"signature\": \"60efe5ef7c1292efa0b0e10c44147f8ba408c488\"\n}\n\n ```\n\n---\n\nДля Paybox\n\n```\n{\n    \"pg_merchant_id\": \"12345\",\n    \"pg_amount\": 3000,\n    \"pg_order_id\": \"d4ce08d6-7313-49dd-abb4-9d08b37096b9\",\n    \"pg_description\": \"Пополнение кошелька SKIF PRO\",\n    \"pg_success_url\": \"https://dev.skif.pro\",\n    \"pg_salt\": \"659bc044-a8d8-4da5-95a2-0a3fea31dd18\",\n    \"customOrderId\": \"612-9c00c\",\n    \"pg_testing_mode\": 1,\n    \"pg_result_url\": \"https://dev.skif.pro/api_v1/billing_success\",\n    \"pg_receipt_positions\": [\n        {\n            \"name\": \"Пополнение кошелька SKIF PRO\",\n            \"paymentMethod\": \"full_payment\",\n            \"paymentObject\": \"payment\",\n            \"price\": \"3000.0\",\n            \"count\": \"1\",\n            \"sno\": \"usn_income\",\n            \"vat\": \"none\",\n            \"tax_type\": 0\n        }\n    ],\n    \"unixTimestamp\": 1670310278,\n    \"pg_sig\": \"a7065338d399008135d354284ff0e388\"\n}\n\n ```",
        "operationId": "billCreateOrder",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "amount": {
                    "type": "number",
                    "example": 3000
                  },
                  "skip_init_payment": {
                    "type": "boolean",
                    "example": true
                  },
                  "start_recurrent": {
                    "type": "number",
                    "example": 1
                  }
                }
              },
              "examples": {
                "/bill_create_order": {
                  "value": {
                    "amount": 3000,
                    "skip_init_payment": true,
                    "start_recurrent": 1
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/billing_success": {
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Webhook платежного шлюза (Callback об оплате)",
        "description": "Обработка уведомлений (Webhook) от эквайринга банка (Тинькофф/Сбер/ЮKassa) о статусе транзакции.",
        "operationId": "billingSuccess",
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "amount": {
                    "type": "string",
                    "example": "10.00"
                  },
                  "auth_code": {
                    "type": "string",
                    "example": "201471"
                  },
                  "auth_number": {
                    "type": "string",
                    "example": "2164219385"
                  },
                  "client_email": {
                    "type": "string",
                    "example": "example@example.ru"
                  },
                  "client_phone": {
                    "type": "string",
                    "example": "+79999999999"
                  },
                  "created_datetime": {
                    "type": "string",
                    "example": "2019-10-04 03:56:09"
                  },
                  "currency": {
                    "type": "string",
                    "example": "RUB"
                  },
                  "merchant": {
                    "type": "string",
                    "example": "51cb8a0f-6fb8-4a20-98b1-9fd85dc47500"
                  },
                  "meta": {
                    "type": "string",
                    "example": "'{\"bill_id\": \"vlICmFjY7nST9KARa5RsSJ\"}'"
                  },
                  "order_id": {
                    "type": "string",
                    "example": "697144"
                  },
                  "original_amount": {
                    "type": "string",
                    "example": "10.00"
                  },
                  "pan_mask": {
                    "type": "string",
                    "example": "220011**4440"
                  },
                  "payment_method": {
                    "type": "string",
                    "example": "card"
                  },
                  "rrn": {
                    "type": "string",
                    "example": "927703219385"
                  },
                  "salt": {
                    "type": "string",
                    "example": "DB9481A6554924BFD2F2279B5AD05B9D"
                  },
                  "signature": {
                    "type": "string",
                    "example": "622e1486dba17d05d080c6734131205a75d59188"
                  },
                  "state": {
                    "type": "string",
                    "example": "COMPLETE"
                  },
                  "testing": {
                    "type": "string",
                    "example": "1"
                  },
                  "transaction_id": {
                    "type": "string",
                    "example": "0EyuFLLZ9DagCXy8O67Q6x"
                  },
                  "unix_timestamp": {
                    "type": "string",
                    "example": "1570161434"
                  }
                }
              },
              "examples": {
                "/billing_success": {
                  "value": {
                    "amount": "10.00",
                    "auth_code": "201471",
                    "auth_number": "2164219385",
                    "client_email": "example@example.ru",
                    "client_phone": "+79999999999",
                    "created_datetime": "2019-10-04 03:56:09",
                    "currency": "RUB",
                    "merchant": "51cb8a0f-6fb8-4a20-98b1-9fd85dc47500",
                    "meta": "'{\"bill_id\": \"vlICmFjY7nST9KARa5RsSJ\"}'",
                    "order_id": "697144",
                    "original_amount": "10.00",
                    "pan_mask": "220011**4440",
                    "payment_method": "card",
                    "rrn": "927703219385",
                    "salt": "DB9481A6554924BFD2F2279B5AD05B9D",
                    "signature": "622e1486dba17d05d080c6734131205a75d59188",
                    "state": "COMPLETE",
                    "testing": "1",
                    "transaction_id": "0EyuFLLZ9DagCXy8O67Q6x",
                    "unix_timestamp": "1570161434"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "unauthorized",
        "x-rate-limit": "60 req/min",
        "x-internal": true,
        "parameters": []
      }
    },
    "/api_v1/bill_set_billing": {
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Настройка параметров биллинга компании",
        "description": "---\n\n**Роль:** Редактор тарифа и выше.",
        "operationId": "billSetBilling",
        "requestBody": {
          "content": {
            "text/plain": {
              "examples": {
                "/bill_set_billing": {
                  "value": "{\r\n    // \"method\": \"history\",\r\n    // \"compnay_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\r\n    \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\r\n    \"with_trial\": false\r\n    // \"amount\": 15,\r\n    // \"tariff\": {\r\n        // \"units\":4,\r\n        // \"price\": 200\r\n    // }\r\n}"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_transactions": {
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Получение истории финансовых транзакций",
        "description": "**Получение списка транзакций в текущей компании**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n  \"max_rows\": 100,\n  \"first_row\":100,\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"transactions\": [\n        {\n            \"id\": \"6dd2c369-9012-440a-a708-a65b7e6f12fb\",\n            \"timestamp\": \"2021-07-29 17:35:57\",\n            \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n            \"user_id\": \"null\",\n            \"amount\": 0,\n            \"amount_before\": 0,\n            \"amount_after\": 0,\n            \"order_id\": null,\n            \"custom_order_id\": null\n        }\n    ]\n}\n\n ```",
        "operationId": "billTransactions",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "first_row": {
                    "type": "number",
                    "example": 5
                  },
                  "from": {
                    "type": "string",
                    "example": "2021-08-25 00:00:00"
                  },
                  "max_rows": {
                    "type": "number",
                    "example": 15
                  },
                  "to": {
                    "type": "string",
                    "example": "2021-08-26 00:00:00"
                  }
                }
              },
              "examples": {
                "/bill_transactions": {
                  "value": {
                    "first_row": 5,
                    "from": "2021-08-25 00:00:00",
                    "max_rows": 15,
                    "to": "2021-08-26 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "dispatcher",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_tariff_history": {
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "История изменения тарифов компании",
        "description": "**Запрос для получения списка истории изменений тарифов текущей компании**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n  \"max_rows\": 100,\n  \"first_row\":100,\n  \"from\": 2021-07-29 17:35:57,\n  \"to\":2021-07-29 17:35:57\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n[\n    {\n        \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n        \"user_name\": \"vlad\",\n        \"datepoint\": \"2021-07-29 18:12:50\",\n        \"new_tariff\": {\n            \"units\": 4,\n            \"price\": 200,\n            \"total\": 800\n        },\n        \"old_tariff\": {\n            \"units\": 3,\n            \"price\": 250,\n            \"total\": 750\n        }\n    },\n    {\n        \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n        \"user_name\": \"vlad\",\n        \"datepoint\": \"2021-07-29 18:12:39\",\n        \"new_tariff\": {\n            \"units\": 3,\n            \"price\": 250,\n            \"total\": 750\n        },\n        \"old_tariff\": {\n            \"units\": 2,\n            \"price\": 200,\n            \"total\": 400\n        }\n    },\n    {\n        \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n        \"user_name\": \"vlad\",\n        \"datepoint\": \"2021-07-29 17:35:52\",\n        \"new_tariff\": {\n            \"units\": 2,\n            \"price\": 200,\n            \"total\": 400\n        }\n    }\n]\n\n ```",
        "operationId": "billTariffHistory",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "first_row": {
                    "type": "number",
                    "example": 0
                  },
                  "from": {
                    "type": "string",
                    "example": "2021-07-01 00:00:00"
                  },
                  "max_rows": {
                    "type": "number",
                    "example": 100
                  },
                  "to": {
                    "type": "string",
                    "example": "2021-08-31 00:00:00"
                  }
                }
              },
              "examples": {
                "/bill_tariff_history": {
                  "value": {
                    "first_row": 0,
                    "from": "2021-07-01 00:00:00",
                    "max_rows": 100,
                    "to": "2021-08-31 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_tariff": {
      "put": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Смена или продление тарифного плана",
        "description": "**Создает тариф для текущей компании**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"tariff\":{\n        \"units\": 1,\n        \"length\": 30,\n        \"price\": 300\n    }\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"amount\": 236,\n    \"rate\": 600,\n    \"company_status\": \"BLOCKED\",\n    \"valid_from\": \"2021-08-20 14:08:56\",\n    \"tariff\": {\n        \"units\": 2,\n        \"price\": 300,\n        \"total\": 600,\n        \"length\": 30\n    }\n}\n\n ```",
        "operationId": "billTariff",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tariff": {
                    "type": "object",
                    "properties": {
                      "units": {
                        "type": "number",
                        "example": 1
                      }
                    }
                  }
                }
              },
              "examples": {
                "/bill_tariff": {
                  "value": {
                    "tariff": {
                      "units": 1
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_transaction": {
      "put": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Корректировка или проведение транзакции",
        "description": "Добавляет дилером транзакцию в компанию со статусом оплаты CASH.\n\n---\n\nИспользуется для того, чтобы учитывать оплаты произведенные наличными.\n\n---\n\n**Роль:** Редактор тарифа и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n\"amount\": 2500,\n\"company_id\": \"0f90e21b-a5a9-4929-8d83-67951440df61\",\n\"custom_order_id\": \"12344\"\n}\n\n ```",
        "operationId": "billTransaction",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "amount": {
                    "type": "number",
                    "example": 2501
                  },
                  "company_id": {
                    "type": "string",
                    "example": "0f90e21b-a5a9-4929-8d83-67951440df61"
                  }
                }
              },
              "examples": {
                "/bill_transaction": {
                  "value": {
                    "amount": 2501,
                    "company_id": "0f90e21b-a5a9-4929-8d83-67951440df61"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "superadmin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_tariff_admin": {
      "put": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Редактирование тарифного плана в биллинге",
        "description": "**Изменение тарифа для компании**\n\n---\n\n**Роль:** Редактор тарифа и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"amount\": 0,\n    \"rate\": 500,\n    \"company_status\": \"ACTIVE\",\n    \"valid_from\": \"2021-10-28 10:19:17\",\n    \"tariff\": {\n        \"units\": 2,\n        \"price\": 250,\n        \"total\": 500,\n        \"length\": 30\n    },\n    \"currency\": {\n        \"code\": \"RUB\"\n    },\n    \"company_id\": \"483aafbf-7682-471c-8612-555dcb0ed584\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"amount\": 0,\n    \"rate\": 500,\n    \"company_status\": \"ACTIVE\",\n    \"valid_to\": \"2021-11-27 10:19:17\",\n    \"valid_from\": \"2021-10-28 10:19:17\",\n    \"tariff\": {\n        \"units\": 2,\n        \"price\": 250,\n        \"total\": 500,\n        \"length\": 30\n    },\n    \"currency\": {\n        \"code\": \"RUB\"\n    },\n    \"company_id\": \"483aafbf-7682-471c-8612-555dcb0ed584\"\n}\n\n ```",
        "operationId": "billTariffAdmin1",
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/bill_stop_auto_pay": {
                  "value": "{\n    \"company_status\": \"ACTIVE\" ,\n    \"valid_from\":\"2021-08-27 11:19:10\",\n    \"valid_to\": \"2021-08-27 11:24:09\",\n    \"tariff\": {\n        \"units\": 2,\n        \"price\": 20,\n        \"length\": 3002,\n    },\n    \"company_id\": \"7bcba823-3aa4-455d-be8a-db04c39e9409\"\n}"
                },
                "/bill_tariff_admin": {
                  "value": "{\n    \"company_status\": \"ACTIVE\" ,\n    \"valid_from\":\"2021-08-27 11:19:10\",\n    \"valid_to\": \"2021-08-27 11:24:09\",\n    \"tariff\": {\n        \"units\": 2,\n        \"price\": 20,\n        \"length\": 3002,\n    },\n    \"company_id\": \"7bcba823-3aa4-455d-be8a-db04c39e9409\"\n}"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "superadmin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      },
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Создание тарифного плана в биллинге",
        "description": "**Возвращает информацию о тарифе для списка компаний**\n\n---\n\nЗапрос без списка компаний возвращает транзакции по всем компаниям.\n\n---\n\n**Роль:** Редактор тарифа и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"companies\": [\n        {\n            \"id\": \"7bcba823-3aa4-455d-be8a-db04c39e9409\"\n        },\n        {\n            \"id\": \"fe371bd9-bba3-4c4a-b54b-b05fb77690c9\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n[\n    {\n        \"amount\": 370,\n        \"rate\": 9000,\n        \"company_status\": \"ACTIVE\",\n        \"valid_to\": \"2021-10-30 00:00:00\",\n        \"valid_from\": \"2021-10-28 09:07:28\",\n        \"tariff\": {\n            \"units\": 36,\n            \"price\": 250,\n            \"total\": 9000,\n            \"length\": 30\n        },\n        \"currency\": {\n            \"code\": \"RUB\"\n        },\n        \"company_id\": \"7bcba823-3aa4-455d-be8a-db04c39e9409\"\n    },\n    {\n        \"amount\": 0,\n        \"tariff\": {\n            \"units\": 0,\n            \"price\": 250,\n            \"total\": 0,\n            \"length\": 30\n        },\n        \"currency\": {\n            \"code\": \"RUB\"\n        },\n        \"company_id\": \"fe371bd9-bba3-4c4a-b54b-b05fb77690c9\"\n    }\n]\n\n ```",
        "operationId": "billTariffAdmin",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "7bcba823-3aa4-455d-be8a-db04c39e9409"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "7bcba823-3aa4-455d-be8a-db04c39e9409"
                      },
                      {
                        "id": "fe371bd9-bba3-4c4a-b54b-b05fb77690c9"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/bill_tariff_admin": {
                  "value": {
                    "companies": [
                      {
                        "id": "7bcba823-3aa4-455d-be8a-db04c39e9409"
                      },
                      {
                        "id": "fe371bd9-bba3-4c4a-b54b-b05fb77690c9"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "superadmin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_transactions_admin": {
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Общий реестр финансовых транзакций (Админ)",
        "description": "**Получение списка всех транзакций для списка компаний с пагинацией**\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"companies\": [\n        {\n            \"id\": \"7bcba823-3aa4-455d-be8a-db04c39e9409\"\n        },\n        {\n            \"id\": \"fe371bd9-bba3-4c4a-b54b-b05fb77690c9\"\n        }\n    ],\n    \"max_rows\": 15,\n    \"first_row\": 5,\n    \"from\": \"2021-08-25 00:00:00\",\n    \"to\": \"2021-08-26 00:00:00\",\n    \"conditions\": [\n        {\"key\": \"payment_type\", \"values\": [\"CARD_DEPOSIT\", \"CASH_DEPOSIT\"]}\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"max\": 485,\n    \"transactions\": [\n        {\n            \"id\": \"7b145ed1-04ec-401a-a643-07dc2d45c693\",\n            \"timestamp\": \"2022-03-25 08:19:15\",\n            \"company_id\": \"41ee3ec9-185b-4af7-bfc0-ff370835b9b9\",\n            \"user_id\": null,\n            \"amount\": 0,\n            \"amount_before\": 0,\n            \"amount_after\": 0,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"TRIAL_ACTIVATION\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"kgKzLQdVTgJcVoEbOmKufd\",\n            \"timestamp\": \"2022-03-10 07:29:00\",\n            \"company_id\": \"7bcba823-3aa4-455d-be8a-db04c39e9409\",\n            \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n            \"amount\": 55,\n            \"amount_before\": 870,\n            \"amount_after\": 925,\n            \"order_id\": \"0032a6ec-a8f6-416c-9647-a937b0f893a8\",\n            \"custom_order_id\": \"103-2c204\",\n            \"payment_type\": \"CARD\",\n            \"operation_type\": \"CARD_DEPOSIT\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"a58e22ed-c671-4c4c-812f-a6c0f091fc8d\",\n            \"timestamp\": \"2022-03-01 13:26:51\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -222,\n            \"amount_before\": 318,\n            \"amount_after\": 96,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"4028e3e3-fa5b-4e2d-8f40-ee6a9d624b77\",\n            \"timestamp\": \"2022-03-01 13:26:07\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -222,\n            \"amount_before\": 540,\n            \"amount_after\": 318,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"e3c08461-8ba3-4f46-b436-1f88fe23bd23\",\n            \"timestamp\": \"2022-03-01 13:23:49\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -222,\n            \"amount_before\": 762,\n            \"amount_after\": 540,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"4d5e983b-db17-4b29-8ee7-198c66b5159f\",\n            \"timestamp\": \"2022-03-01 13:21:09\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -500,\n            \"amount_before\": 1262,\n            \"amount_after\": 762,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"4b0ad5d3-6761-400b-a89b-8229426b8684\",\n            \"timestamp\": \"2022-03-01 12:57:30\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -246,\n            \"amount_before\": 1508,\n            \"amount_after\": 1262,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"d31e05ba-35c5-473b-be60-6ac503bc7cfa\",\n            \"timestamp\": \"2022-03-01 12:47:31\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -246,\n            \"amount_before\": 1754,\n            \"amount_after\": 1508,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"MDvUB6sV90PvV03QSBDsso\",\n            \"timestamp\": \"2022-03-01 12:47:16\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n            \"amount\": 1500,\n            \"amount_before\": 254,\n            \"amount_after\": 1754,\n            \"order_id\": \"2829e663-682a-4806-bd80-9b839e43af3e\",\n            \"custom_order_id\": \"13-70652\",\n            \"payment_type\": \"CARD\",\n            \"operation_type\": \"CARD_DEPOSIT\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"6c8de8b5-50af-47d8-b32d-5064254e82cf\",\n            \"timestamp\": \"2022-03-01 12:46:46\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -246,\n            \"amount_before\": 500,\n            \"amount_after\": 254,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"FsZGSq9QABMVTEhs0IjWBU\",\n            \"timestamp\": \"2022-03-01 12:46:46\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n            \"amount\": 500,\n            \"amount_before\": 0,\n            \"amount_after\": 500,\n            \"order_id\": \"4176e398-06ea-472d-a959-166e38a1f1db\",\n            \"custom_order_id\": \"13-e953c\",\n            \"payment_type\": \"CARD\",\n            \"operation_type\": \"CARD_DEPOSIT\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"509e2cc1-72b5-41c9-8120-01fe8b3168d9\",\n            \"timestamp\": \"2022-02-22 10:07:39\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": null,\n            \"amount\": -500,\n            \"amount_before\": 500,\n            \"amount_after\": 0,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"sps3w0Kn5osyE0jl9UTwa3\",\n            \"timestamp\": \"2022-02-22 10:07:39\",\n            \"company_id\": \"8981e6d1-79d4-4030-9d60-e2701b37e796\",\n            \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n            \"amount\": 500,\n            \"amount_before\": 0,\n            \"amount_after\": 500,\n            \"order_id\": \"f7a007d9-7a4e-467d-8ce8-61ce72c8c2b2\",\n            \"custom_order_id\": \"222-13a58\",\n            \"payment_type\": \"CARD\",\n            \"operation_type\": \"CARD_DEPOSIT\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"b65c8bf5-3f2b-4611-acdc-6da4f67a8e08\",\n            \"timestamp\": \"2022-02-22 09:49:18\",\n            \"company_id\": \"3c6e77d4-4dcb-456f-b67c-62ed8cc62aa8\",\n            \"user_id\": null,\n            \"amount\": -500,\n            \"amount_before\": 500,\n            \"amount_after\": 0,\n            \"order_id\": null,\n            \"custom_order_id\": null,\n            \"operation_type\": \"WITHDRAWAL\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        },\n        {\n            \"id\": \"HUUfhpRxEbtMMb6AAPEf9G\",\n            \"timestamp\": \"2022-02-22 09:49:18\",\n            \"company_id\": \"3c6e77d4-4dcb-456f-b67c-62ed8cc62aa8\",\n            \"user_id\": \"98cf93bb-9312-46e2-97b6-f699ae7b3f06\",\n            \"amount\": 500,\n            \"amount_before\": 0,\n            \"amount_after\": 500,\n            \"order_id\": \"876cee04-b94a-450a-b896-84c0990a3cd6\",\n            \"custom_order_id\": \"222-336fd\",\n            \"payment_type\": \"CARD\",\n            \"operation_type\": \"CARD_DEPOSIT\",\n            \"currency\": {\n                \"code\": \"RUB\"\n            }\n        }\n    ]\n}\n\n ```",
        "operationId": "billTransactionsAdmin",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "7bcba823-3aa4-455d-be8a-db04c39e9409"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "7bcba823-3aa4-455d-be8a-db04c39e9409"
                      },
                      {
                        "id": "fe371bd9-bba3-4c4a-b54b-b05fb77690c9"
                      }
                    ]
                  },
                  "first_row": {
                    "type": "number",
                    "example": 5
                  },
                  "from": {
                    "type": "string",
                    "example": "2021-08-25 00:00:00"
                  },
                  "max_rows": {
                    "type": "number",
                    "example": 15
                  },
                  "to": {
                    "type": "string",
                    "example": "2021-08-26 00:00:00"
                  }
                }
              },
              "examples": {
                "/bill_transactions_admin": {
                  "value": {
                    "companies": [
                      {
                        "id": "7bcba823-3aa4-455d-be8a-db04c39e9409"
                      },
                      {
                        "id": "fe371bd9-bba3-4c4a-b54b-b05fb77690c9"
                      }
                    ],
                    "first_row": 5,
                    "from": "2021-08-25 00:00:00",
                    "max_rows": 15,
                    "to": "2021-08-26 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_transactions_admin_excel": {
      "post": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Экспорт реестра транзакций в Microsoft Excel",
        "description": "Экспорт транзакций для списка компаний с пагинацией\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nPOST /bill_transactions_admin_excel?body={  \n\"companies\": \\[  \n{  \n\"id\": \"7bcba823-3aa4-455d-be8a-db04c39e9409\"  \n},  \n{  \n\"id\": \"fe371bd9-bba3-4c4a-b54b-b05fb77690c9\"  \n}  \n\\],  \n\"from\": \"2021-08-25 09:00:00\",  \n\"to\": \"2021-08-26 19:00:00\"  \n}\n\nВ теле запроса необходимо отправить следующие поля:\n\ncompanies - списко выбранных компаний, необязательное\n\nfrom - начала периода\n\nto - окончания периода\n\n---\n\nВ ответе возвращается эксель файл",
        "operationId": "billTransactionsAdminExcel",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "payment_type"
                        },
                        "values": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "example": "CARD_DEPOSIT"
                          },
                          "example": [
                            "CARD_DEPOSIT",
                            "CASH_DEPOSIT"
                          ]
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "payment_type",
                        "values": [
                          "CARD_DEPOSIT",
                          "CASH_DEPOSIT"
                        ]
                      }
                    ]
                  },
                  "dealer": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "c5e63357-6b63-4ea4-8b91-beb53f749f69"
                      }
                    }
                  },
                  "first_row": {
                    "type": "number",
                    "example": 0
                  },
                  "from": {
                    "type": "string",
                    "example": "2024-04-01 00:00:00"
                  },
                  "max_rows": {
                    "type": "number",
                    "example": 100
                  },
                  "timezone_key": {
                    "type": "string",
                    "example": "UTC+3"
                  },
                  "to": {
                    "type": "string",
                    "example": "2024-05-01 00:00:00"
                  }
                }
              },
              "examples": {
                "/bill_transactions_admin_excel": {
                  "value": {
                    "conditions": [
                      {
                        "key": "payment_type",
                        "values": [
                          "CARD_DEPOSIT",
                          "CASH_DEPOSIT"
                        ]
                      }
                    ],
                    "dealer": {
                      "id": "c5e63357-6b63-4ea4-8b91-beb53f749f69"
                    },
                    "first_row": 0,
                    "from": "2024-04-01 00:00:00",
                    "max_rows": 100,
                    "timezone_key": "UTC+3",
                    "to": "2024-05-01 00:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Бинарный файл книги Microsoft Excel (.xlsx)",
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_stop_auto_pay": {
      "put": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Отключение регулярного автоплатежа",
        "description": "**Остановка автоплатежа для компании**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Параметры ответа:**\n\nВ случае успешного отключения возвращается код 200 c пустым body.\n\nЕсли не добавлена карта или не включен автоплатеж, то возвращается ошибка.\n\nПример ошибки:\n\n```\n{\n    \"code\": 4220,\n    \"field\": \"\",\n    \"message\": \"Карта не добавлена\"\n}\n\n ```",
        "operationId": "billStopAutoPay",
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/bill_stop_auto_pay": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_start_auto_pay": {
      "put": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Включение регулярного автоплатежа",
        "description": "**Включение автоплатежа для компании**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Параметры ответа:**\n\nВ случае успешного включения возвращается код 200 c пустым body.\n\nЕсли не добавлена карта или уже включен автоплатеж, то возвращантся ошибка.\n\nПример ошибки:\n\n```\n{\n    \"code\": 4220,\n    \"field\": \"\",\n    \"message\": \"Карта не добавлена\"\n}\n\n ```",
        "operationId": "billStartAutoPay",
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/bill_start_auto_pay": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/bill_remove_card": {
      "put": {
        "tags": [
          "Биллинг"
        ],
        "summary": "Отвязка банковской карты компании",
        "description": "**Удаление сохраненной карты**\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Параметры ответа:**\n\nВ случае успешного удаления возвращается код 200 c пустым body.\n\nЕсли не добавлена карта, возвращается ошибка.\n\nПример ошибки:\n\n```\n{\n\"code\": 4220,\n\"field\": \"\",\n\"message\": \"Карта не добавлена\"\n}\n\n ```",
        "operationId": "billRemoveCard",
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/bill_remove_card": {
                  "value": ""
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/terminals": {
      "get": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals?ids=:ids",
        "description": "**Поиск imei по ID**\n\n---\n\nВозвращает массив терминалов компании\n\nЕсли в параметре ids содержится только один id, то вернется не массив из 1 элемента, а конкретный терминал.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n/terminals?ids=da47b5da-d030-44f0-acc4-a43107dbb090\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"d88cb614-7d0e-48d5-ba95-0001825d68a8\",\n    \"imei\": \"123456\",\n    \"password\": \"xyz\",\n    \"use_lbs_for_coords\": false\n}\n\n ```",
        "operationId": "terminalsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals",
        "description": "**Создание нового терминала в компании**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Параметры:**\n\n```\n\"company_id\": ID компании, обязательно\n\"imei\": Imei, текст, обязательно,\n\"password\": Пароль, текст, необязательно,\n\"is_blocked\": true, если блокирован, необязательно\n\"use_lbs_for_coords\": true, если определение координат по GPS должно дополняться координатами по LBS\n\n ```\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"12345678\",\n    \"password\": \"xyz\",\n    \"use_lbs_for_coords\": true\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданная запись\n\n```\n{\n    \"id\": \"da47b5da-d030-44f0-acc4-a43107dbb090\",\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"12345678\",\n    \"password\": \"xyz\",\n    \"use_lbs_for_coords\": true\n}\n\n ```",
        "operationId": "terminals",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39"
                  },
                  "imei": {
                    "type": "string",
                    "example": "12345678910"
                  }
                }
              },
              "examples": {
                "/terminals": {
                  "value": {
                    "company_id": "a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39",
                    "imei": "12345678910"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals?ids=:ids",
        "description": "**Планирование удаления терминалов компании по их ID**\n\n---\n\nСм. DELETE /units?ids=:ids\n\n---\n\n**Роль:** Супервизор и выше.",
        "operationId": "terminalsIdsIds1",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/terminals_bulk": {
      "post": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals_bulk",
        "description": "**Создание нескольких терминалов в компании**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Параметры:**\n\n```\n\"companies\": Список компании, обязательно\n\"imeis\": список Imei, текст, обязательно,\n\"password\": Пароль, тектс, необязательно\n\n ```\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"companies\": [\n      {\"id\": \"d852f0ef-ed7e-490b-866d-a6f1a1eb354f\"},\n      {\"id\": \"6b994029-6aa1-4e87-9207-36056ca890dd\"}\n    ],\n    \"imeis\": [\"11345679\", \"113456710\"],\n    \"password\": \"xyzt\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданные записи\n\n```\n[\n    {\n        \"id\": \"a4f71782-9ccf-4da2-a132-303c27c48707\",\n        \"company_id\": \"d852f0ef-ed7e-490b-866d-a6f1a1eb354f\",\n        \"imei\": \"11345679\",\n        \"password\": \"xyzt\"\n    },\n    {\n        \"id\": \"99d307f0-5c20-45bf-a6b7-d261d75327cc\",\n        \"company_id\": \"d852f0ef-ed7e-490b-866d-a6f1a1eb354f\",\n        \"imei\": \"113456710\",\n        \"password\": \"xyzt\"\n    },\n    {\n        \"id\": \"84797aa9-0aad-459a-80ac-9cd2601b587b\",\n        \"company_id\": \"6b994029-6aa1-4e87-9207-36056ca890dd\",\n        \"imei\": \"11345679\",\n        \"password\": \"xyzt\"\n    },\n    {\n        \"id\": \"f4a42e66-27eb-4e98-b51d-4f36de23458a\",\n        \"company_id\": \"6b994029-6aa1-4e87-9207-36056ca890dd\",\n        \"imei\": \"113456710\",\n        \"password\": \"xyzt\"\n    }\n]\n\n ```",
        "operationId": "terminalsBulk",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "d852f0ef-ed7e-490b-866d-a6f1a1eb354f"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "d852f0ef-ed7e-490b-866d-a6f1a1eb354f"
                      },
                      {
                        "id": "6b994029-6aa1-4e87-9207-36056ca890dd"
                      }
                    ]
                  },
                  "imeis": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "11345679"
                    },
                    "example": [
                      "11345679",
                      "113456710"
                    ]
                  },
                  "password": {
                    "type": "string",
                    "example": "xyzt"
                  }
                }
              },
              "examples": {
                "/terminals_bulk": {
                  "value": {
                    "companies": [
                      {
                        "id": "d852f0ef-ed7e-490b-866d-a6f1a1eb354f"
                      },
                      {
                        "id": "6b994029-6aa1-4e87-9207-36056ca890dd"
                      }
                    ],
                    "imeis": [
                      "11345679",
                      "113456710"
                    ],
                    "password": "xyzt"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/terminals/{id}": {
      "put": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals/:id",
        "description": "**Обновить данные терминала**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Параметры:**\n\nсм метод POST /terminals\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /terminals?ids=:id",
        "operationId": "terminalsId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                  },
                  "company_name": {
                    "type": "string",
                    "example": "0Одуванчик"
                  },
                  "id": {
                    "type": "string",
                    "example": "1a2e1319-abfc-4406-ae1e-dc348937ef5c"
                  },
                  "imei": {
                    "type": "string",
                    "example": "43235674543234534532"
                  },
                  "is_blocked": {
                    "type": "boolean",
                    "example": false
                  },
                  "password": {
                    "type": "string",
                    "example": ""
                  },
                  "use_lbs_for_coords": {
                    "type": "boolean",
                    "example": false
                  },
                  "use_previous_param_value": {
                    "type": "boolean",
                    "example": true
                  }
                }
              },
              "examples": {
                "/terminals/:id": {
                  "value": {
                    "company_id": "3e70f167-9fad-4753-bccf-d7d47c2c648c",
                    "company_name": "0Одуванчик",
                    "id": "1a2e1319-abfc-4406-ae1e-dc348937ef5c",
                    "imei": "43235674543234534532",
                    "is_blocked": false,
                    "password": "",
                    "use_lbs_for_coords": false,
                    "use_previous_param_value": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals/:id",
        "description": "**Удаление терминала компании по его ID**\n\n---\n\n**Параметры:**\n\nid записи\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Ответ:** 200\n\nЕсли терминал с таким id не найден, то возвращается ошибка 422\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "terminalsId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID терминала"
        }
      ]
    },
    "/api_v1/terminals/batch": {
      "patch": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals/batch",
        "description": "**Обновить данные терминала**\n\n---\n\nМассовое обновление некоторых полей выбранных терминалв\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Боди запроса:**\n\nterminals - Список терминалов\n\nis_blocked - true для блокировки, false для разблокировки\n\n---\n\n**Ответ:**\n\nВозвращаются обновленные терминалы\n\nПример запроса:\n\n```\n{\n    \"terminals\": [\n        {\"id\": \"d799058e-1be8-4404-b476-6b5e49d4844a\"},\n        {\"id\": \"3f6f01f0-edcd-4942-94e5-45dd8e293150\"},\n        {\"id\": \"56760481-d045-4091-9b5d-ad092c14a69e\"}\n    ],\n    \"is_blocked\": true\n}\n\n ```\n\nПример ответа:\n\n```\n[\n    {\n        \"id\": \"d799058e-1be8-4404-b476-6b5e49d4844a\",\n        \"company_id\": \"bfbb4c66-4242-4997-8905-425245d8136f\",\n        \"dealer_id\": \"17d41d6f-a8ae-4644-9793-92988604746a\",\n        \"imei\": \"3528480xxxxxxxx\",\n        \"is_blocked\": false,\n        \"use_lbs_for_coords\": false,\n        \"use_previous_param_value\": false\n    },\n    {\n        \"id\": \"3f6f01f0-edcd-4942-94e5-45dd8e293150\",\n        \"company_id\": \"bfbb4c66-4242-4997-8905-425245d8136f\",\n        \"dealer_id\": \"17d41d6f-a8ae-4644-9793-92988604746a\",\n        \"imei\": \"3528480xxxxxxxx\",\n        \"is_blocked\": false,\n        \"use_lbs_for_coords\": false,\n        \"use_previous_param_value\": false\n    },\n    {\n        \"id\": \"56760481-d045-4091-9b5d-ad092c14a69e\",\n        \"company_id\": \"d5fbe5f4-5d68-41bc-bb43-2dea42569fdb\",\n        \"dealer_id\": \"17d41d6f-a8ae-4644-9793-92988604746a\",\n        \"imei\": \"3528480xxxxxxxx\",\n        \"is_blocked\": false,\n        \"use_lbs_for_coords\": false,\n        \"use_previous_param_value\": false\n    }\n]\n\n ```",
        "operationId": "terminalsBatch",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "is_blocked": {
                    "type": "boolean",
                    "example": true
                  },
                  "terminals": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "d799058e-1be8-4404-b476-6b5e49d4844a"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "d799058e-1be8-4404-b476-6b5e49d4844a"
                      },
                      {
                        "id": "3f6f01f0-edcd-4942-94e5-45dd8e293150"
                      },
                      {
                        "id": "56760481-d045-4091-9b5d-ad092c14a69e"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/terminals/batch": {
                  "value": {
                    "is_blocked": true,
                    "terminals": [
                      {
                        "id": "d799058e-1be8-4404-b476-6b5e49d4844a"
                      },
                      {
                        "id": "3f6f01f0-edcd-4942-94e5-45dd8e293150"
                      },
                      {
                        "id": "56760481-d045-4091-9b5d-ad092c14a69e"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "20 req/min"
      }
    },
    "/api_v1/terminals/list": {
      "post": {
        "tags": [
          "Терминалы"
        ],
        "summary": "/terminals/list",
        "description": "Поиск терминалов по фильтру\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nsortField - поле сортировки, значения  \n\\[imei\\]\n\nsortDesc - сортировка по убыванию, значения \"true\", \"false\".\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - imei\n\ncompanies - список компаний в которых искать терминал\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\nПолучить первые 2 imei компании 36c52c2b-64a0-45dd-a75f-3c723fffee77 или 95f38fda-b8b5-4754-8fa2-07fadb72637d имеющие подстроку \"123\"\n\nЕсли у пользователя роль не супервизор, то возвращается только imei компании пользователя.\n\n```\n{\n    \"from\": 0,\n    \"count\": 2,\n    \"sortField\": \"imei\",\n    \"conditions\": [\n        {\n            \"field\": \"imei\",\n            \"value\": \"123\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 9,\n    \"list\": [\n        {\n            \"id\": \"fcdb331c-4e27-4fb3-91b6-443330dbef2c\",\n            \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n            \"imei\": \"862531040000017\",\n            \"password\": \"123456\"\n        },\n        {\n            \"id\": \"0ad9df34-ce6e-4665-a1f8-f6e2d93d5d1e\",\n            \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n            \"imei\": \"862531040000016\",\n            \"is_blocked\": true\n        }\n    ]\n}\n\n ```",
        "operationId": "terminalsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "6c1a0092-9f99-4fb0-a2f3-37eb8db08b31"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "6c1a0092-9f99-4fb0-a2f3-37eb8db08b31"
                      }
                    ]
                  },
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "imei"
                        },
                        "value": {
                          "type": "string",
                          "example": "123"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "imei",
                        "value": "123"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 2
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "sortField": {
                    "type": "string",
                    "example": "imei"
                  }
                }
              },
              "examples": {
                "/terminals/list": {
                  "value": {
                    "companies": [
                      {
                        "id": "6c1a0092-9f99-4fb0-a2f3-37eb8db08b31"
                      }
                    ],
                    "conditions": [
                      {
                        "field": "imei",
                        "value": "123"
                      }
                    ],
                    "count": 2,
                    "from": 0,
                    "sortField": "imei"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/terminals_logs": {
      "get": {
        "tags": [
          "Терминалы"
        ],
        "summary": "Журнал сырых данных и сообщений терминала",
        "description": "Возвращает пагинированный список телематических логов и сообщений, поступивших от терминала с указанным IMEI.",
        "operationId": "terminalsLogsFromMaxTerminalIdTerminalId",
        "parameters": [
          {
            "name": "imei",
            "in": "query",
            "required": true,
            "description": "IMEI терминала (15 цифр)",
            "schema": {
              "type": "string",
              "example": "862531040000001"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Начальное смещение списка логов (индекс с нуля)",
            "schema": {
              "type": "integer",
              "default": 0,
              "example": 0
            }
          },
          {
            "name": "max",
            "in": "query",
            "required": false,
            "description": "Максимальное количество возвращаемых записей",
            "schema": {
              "type": "integer",
              "default": 50,
              "example": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Список телематических логов терминала",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "max": {
                      "type": "integer",
                      "example": 120
                    },
                    "list": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "date": {
                            "type": "string",
                            "example": "2026-09-26 11:00:00"
                          },
                          "message": {
                            "type": "string",
                            "example": "Package parsed successfully: 12 sensors"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/retranslators": {
      "get": {
        "tags": [
          "Ретрансляции"
        ],
        "summary": "Получение ретрансляций по идентификаторам",
        "description": "Возвращает ретрансляции по идентификаторам.\n\n---\n\nОтвет всегда собирается по всей ретрансляции целиком. Если запросить\nнесколько идентификаторов одной ретрансляции, в ответе будет один объект,\nпоэтому число объектов может быть меньше, чем число запрошенных `ids`.\n\nЕсли передан один идентификатор, возвращается один объект. Если несколько —\nмассив объектов.\n\n---\n\n**Параметры:**\n\n- `ids` — идентификаторы ретрансляций через запятую, обязательный параметр.\n\n---\n\nИдентификатором может быть любой терминал ретрансляции, не только\nидентификатор из поля `id`.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\nОдна ретрансляция\n\n```\nGET /retranslators?ids=eeadc5d1-9a68-4083-bef6-51173d532cb0\n```\n\nНесколько ретрансляций\n\n```\nGET /retranslators?ids=eeadc5d1-9a68-4083-bef6-51173d532cb0,1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33\n```\n\n---\n\n**Пример ответа** (один идентификатор):\n\n``` json\n{\n    \"id\": \"eeadc5d1-9a68-4083-bef6-51173d532cb0\",\n    \"name\": \"Ретрансляция в Эрнис1\",\n    \"comment\": \"Комментарий диспетчера\",\n    \"retrans_protocol\": \"retranslator_wilaon_ips\",\n    \"retrans_server\": \"195.208.1.1\",\n    \"retrans_port\": 9001,\n    \"retrans_pw\": \"1234\",\n    \"is_active\": true,\n    \"activate_date\": \"2026-08-28 00:00:00\",\n    \"member_name\": \"Иванов И.И.\",\n    \"route_name\": \"Маршрут 15\",\n    \"gps_category_type_key\": \"gps_category_type_s\",\n    \"public_vehicle_type_key\": \"\",\n    \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n    \"imei\": \"862531040000001\",\n    \"to_imei\": \"4324324234\",\n    \"terminals\": [\n        {\n            \"imei\": \"862531040000001\",\n            \"to_imei\": \"4324324234\"\n        },\n        {\n            \"imei\": \"862531040000002\",\n            \"to_imei\": \"3244324\"\n        }\n    ]\n}\n```\n\n---\n\n**Пример ответа** (несколько идентификаторов):\n\n``` json\n[\n    {\n        \"id\": \"eeadc5d1-9a68-4083-bef6-51173d532cb0\",\n        \"name\": \"Ретрансляция в Эрнис1\",\n        \"comment\": \"Комментарий диспетчера\",\n        \"retrans_protocol\": \"retranslator_wilaon_ips\",\n        \"retrans_server\": \"195.208.1.1\",\n        \"retrans_port\": 9001,\n        \"retrans_pw\": \"1234\",\n        \"is_active\": true,\n        \"activate_date\": \"2026-08-28 00:00:00\",\n        \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n        \"imei\": \"862531040000001\",\n        \"to_imei\": \"4324324234\",\n        \"terminals\": [\n            {\n                \"imei\": \"862531040000001\",\n                \"to_imei\": \"4324324234\"\n            }\n        ]\n    },\n    {\n        \"id\": \"1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33\",\n        \"name\": \"Ретрансляция на группу объектов\",\n        \"comment\": \"\",\n        \"retrans_protocol\": \"retranslator_egts\",\n        \"retrans_server\": \"195.208.1.1\",\n        \"retrans_port\": 9002,\n        \"retrans_pw\": \"\",\n        \"is_active\": true,\n        \"activate_date\": \"2026-08-28 00:00:00\",\n        \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n        \"imei\": \"862531040000003\",\n        \"to_imei\": \"862531040000003\",\n        \"terminals\": [\n            {\n                \"imei\": \"862531040000003\",\n                \"to_imei\": \"862531040000003\"\n            },\n            {\n                \"imei\": \"862531040000004\",\n                \"to_imei\": \"862531040000004\"\n            }\n        ]\n    }\n]\n```\n\n---\n\n**Ошибки:**\n\n- `422` — не передан `ids`, либо по переданным идентификаторам\n  не нашлось ни одной ретрансляции;\n- `422` — в `ids` попал некорректный идентификатор;\n- `422` — нет доступа хотя бы к одной из запрошенных ретрансляций.",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "required": true,
            "description": "Идентификаторы ретрансляций через запятую",
            "schema": {
              "type": "string"
            },
            "example": "eeadc5d1-9a68-4083-bef6-51173d532cb0,1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33"
          }
        ],
        "responses": {
          "200": {
            "description": "Ретрансляция или массив ретрансляций",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RetranslatorChannel"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RetranslatorChannel"
                      }
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "description": "Ошибка бизнес-логики",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "code": 4220,
                  "message": "Ретранслятор не найден"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Ретрансляции"
        ],
        "summary": "Создание ретрансляции",
        "description": "Создаёт ретрансляцию и возвращает её в готовом виде — вместе с\nтерминалами, которые за ней закреплены. Создание атомарно: терминалы\nматериализуются сразу в момент создания.\n\n---\n\nТело запроса описано в общей схеме: обязательны `retrans_server`,\n`retrans_port`, `retrans_protocol` и хотя бы один из источников —\n`terminals` или `units_groups_ids` (допускается их одновременное указание\nв смешанном режиме).\n\n---\n\n**Режим `terminals` (ручной выбор):**\n\n- каждый `imei` должен существовать и быть доступен текущему пользователю;\n- `to_imei` обязателен и должен отличаться от `imei`, если сервер\n  принадлежит SKIF;\n- один `imei` нельзя указать дважды в списке;\n- один и тот же терминал нельзя ретранслировать на тот же `retrans_server`\n  и `retrans_port` дважды;\n- проверяется отсутствие зацикленной ретрансляции через серверы SKIF;\n- компания каждой строки всегда берётся у самого терминала. Значение\n  `company_id` из тела задаёт компанию самого канала — мастер-записи,\n  которая появляется только при работе с группами, — и компании ручных\n  терминалов не переопределяет.\n\n---\n\n**Режим `units_groups_ids` (динамические группы):**\n\n- группы проверяются сервисом объектов: группа должна существовать,\nбыть доступна пользователю, и все указанные группы должны принадлежать\n  одной компании;\n- ответ — всегда один объект ретрансляции, а в `terminals` попадают только\n  терминалы с непустым `imei`: отдельной записи без `imei` в ответе нет;\n- терминалы этих групп подтягиваются и материализуются сразу же при\n  создании и возвращаются в массиве `terminals` ответа;\n- у каждого терминала, пришедшего из группы объектов, `to_imei` по\n  умолчанию совпадает с `imei`;\n- ретрансляция подписывается на каждую группу. Дальше состав\n  поддерживается автоматически: при добавлении, изменении или удалении\n  машин в группе сервис объектов сам присылает актуальный список\n  терминалов;\n- если группы принадлежат одной компании, `company_id` передавать в теле\n  не обязательно — он определится автоматически. Если передать, будет\n  использовано переданное значение.\n\n---\n\n**Смешанный режим (`terminals` + `units_groups_ids`):**\n\n- допускается одновременное указание и ручных терминалов, и групп объектов;\n- в массиве `terminals` ответа возвращается объединённый список всех\n  терминалов без дубликатов;\n- если терминал указан в `terminals` вручную и одновременно входит в одну\n  из групп, он получает статус ручного (`MANUAL`): при последующем\n  удалении автомобиля из группы его ретрансляция не прервётся.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса** — смешанный режим (группа + ручной терминал):\n\n``` json\n{\n    \"name\": \"Ретрансляция Карьер и Резерв\",\n    \"comment\": \"Самосвалы по группе + дежурная Газель\",\n    \"retrans_server\": \"195.208.1.1\",\n    \"retrans_port\": 9001,\n    \"retrans_pw\": \"secret123\",\n    \"retrans_protocol\": \"retranslator_wilaon_ips\",\n    \"is_active\": true,\n    \"units_groups_ids\": [\n        \"1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33\"\n    ],\n    \"terminals\": [\n        {\n            \"imei\": \"862531040000099\",\n            \"to_imei\": \"862531040000099\"\n        }\n    ]\n}\n```\n\n---\n\n**Пример ответа:**\n\n``` json\n{\n    \"id\": \"eeadc5d1-9a68-4083-bef6-51173d532cb0\",\n    \"name\": \"Ретрансляция Карьер и Резерв\",\n    \"comment\": \"Самосвалы по группе + дежурная Газель\",\n    \"retrans_protocol\": \"retranslator_wilaon_ips\",\n    \"retrans_server\": \"195.208.1.1\",\n    \"retrans_port\": 9001,\n    \"retrans_pw\": \"secret123\",\n    \"is_active\": true,\n    \"activate_date\": \"2026-10-02 00:00:00\",\n    \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n    \"imei\": \"862531040000099\",\n    \"to_imei\": \"862531040000099\",\n    \"terminals\": [\n        {\n            \"imei\": \"862531040000099\",\n            \"to_imei\": \"862531040000099\"\n        },\n        {\n            \"imei\": \"862531040000001\",\n            \"to_imei\": \"862531040000001\"\n        },\n        {\n            \"imei\": \"862531040000002\",\n            \"to_imei\": \"862531040000002\"\n        }\n    ]\n}\n```\n\nПервый терминал в `terminals` — ручной, из тела запроса, поэтому именно он\nдублируется в полях `imei` и `to_imei`. Терминалы, пришедшие из группы\nобъектов, идут следом в том порядке, в каком их вернул сервис объектов;\nсами группы объектов в ответе не выводятся.\n\n---\n\n**Ошибки:**\n\n- `422` — не передан `retrans_server`, либо в адресе нет точки;\n- `422` — не передан `retrans_port`, либо значение не число или вне\n  диапазона 0–65535;\n- `422` — не передан `retrans_protocol` или значение не из списка допустимых;\n- `422` — не передан ни `terminals`, ни `units_groups_ids`;\n- `422` — терминал не найден или нет доступа к нему;\n- `422` — для сервера SKIF не задан `to_imei` либо он совпадает с `imei`;\n- `422` — `imei` повторяется в списке терминалов;\n- `422` — такой терминал уже ретранслируется на этот же сервер и порт;\n- `422` — ретрансляция зациклена: цепочка терминалов возвращается в себя;\n- `422` — указана недопустимая категория GPS или тип транспорта\n  (значения сверяются со справочником всегда, если переданы);\n- `422` — в `units_groups_ids` попал некорректный идентификатор группы;\n- `422` — группа объектов не найдена или нет доступа к ней;\n- `422` — группы объектов принадлежат разным компаниям;\n- `422` — в режиме `units_groups_ids` не удалось определить компанию\n  и `company_id` не передан в теле запроса.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetranslatorRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Созданная ретрансляция",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetranslatorChannel"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "description": "Ошибка бизнес-логики",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "code": 4220,
                  "message": "Укажите imei в ретрансляторе"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Ретрансляции"
        ],
        "summary": "Массовое удаление ретрансляций",
        "description": "Ставит в очередь на удаление сразу несколько ретрансляций.\n\n---\n\nУдаление отложенное: идентификаторы возвращаются сразу, а сами записи\nудаляются планировщиком позже. Это защищает от случайного удаления большого\nобъёма данных по одному клику.\n\n---\n\nРетрансляция отписывается от своих групп объектов, и её терминалы\nперестают ретранслироваться.\n\n---\n\n**Параметры:**\n\n- `ids` — идентификаторы ретрансляций через запятую, обязательный параметр.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\nDELETE /retranslators?ids=eeadc5d1-9a68-4083-bef6-51173d532cb0,1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33\n```\n\n---\n\n**Пример ответа:**\n\n``` json\n{\n    \"id\": \"3d4f7a1c-8b2e-4c6d-9f1a-5e7b8c9d0a1f\"\n}\n```\n\nИдентификатор из ответа — задача удаления, а не ретрансляция.\n\n---\n\n**Ошибки:**\n\n- `422` — не передан `ids`;\n- `422` — нет доступа хотя бы к одной из указанных ретрансляций.",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "required": true,
            "description": "Идентификаторы ретрансляций через запятую",
            "schema": {
              "type": "string"
            },
            "example": "eeadc5d1-9a68-4083-bef6-51173d532cb0,1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33"
          }
        ],
        "responses": {
          "200": {
            "description": "Идентификатор задачи удаления",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "example": "3d4f7a1c-8b2e-4c6d-9f1a-5e7b8c9d0a1f",
                      "description": "Идентификатор задачи удаления"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "description": "Ошибка бизнес-логики",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "code": 4220,
                  "message": "Нет доступа"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/retranslators/{id}": {
      "put": {
        "tags": [
          "Ретрансляции"
        ],
        "summary": "Обновление ретрансляции",
        "description": "Обновляет ретрансляцию целиком и возвращает её в готовом виде.\n\n---\n\nТело запроса то же, что и при создании: обязательны `retrans_server`,\n`retrans_port`, `retrans_protocol` и один из режимов — `terminals`\nили `units_groups_ids`.\n\n---\n\nВ `units_groups_ids` передаётся полный новый состав групп, а не только\nизменения: группа, которой нет в списке, будет отписана.\n\n---\n\n**Что происходит при обновлении:**\n\n- `{id}` может быть идентификатором ретрансляции или любого её терминала.\n  Обновляется вся ретрансляция вместе с терминалами;\n- проверки `retrans_server`, `retrans_port`, `retrans_protocol` и перечисленных\n  терминалов такие же, как при создании;\n- состав терминалов заменяется на переданный;\n- добавленные группы объектов сразу же подтягивают своих терминалов,\n  а удалённые группы отписываются и их терминалы уходят из ретрансляции;\n- при выключении (`is_active: false`) ретрансляция отписывается от всех групп,\n  при включении — подписывается заново;\n- компания берётся у терминала, а в режиме `units_groups_ids` — по группам.\n  Если `company_id` не передан, сохраняется компания, которая была до этого.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n``` json\n{\n    \"name\": \"Ретрансляция на группу объектов\",\n    \"retrans_server\": \"195.208.1.1\",\n    \"retrans_port\": 9003,\n    \"retrans_protocol\": \"retranslator_egts\",\n    \"is_active\": true,\n    \"units_groups_ids\": [\n        \"1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33\"\n    ]\n}\n```\n\n---\n\n**Пример ответа:**\n\n``` json\n{\n    \"id\": \"1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33\",\n    \"name\": \"Ретрансляция на группу объектов\",\n    \"comment\": \"\",\n    \"retrans_protocol\": \"retranslator_egts\",\n    \"retrans_server\": \"195.208.1.1\",\n    \"retrans_port\": 9003,\n    \"retrans_pw\": \"\",\n    \"is_active\": true,\n    \"activate_date\": \"2026-08-28 00:00:00\",\n    \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n    \"imei\": \"862531040000003\",\n    \"to_imei\": \"862531040000003\",\n    \"terminals\": [\n        {\n            \"imei\": \"862531040000003\",\n            \"to_imei\": \"862531040000003\"\n        }\n    ]\n}\n```\n\n---\n\n**Ошибки:**\n\n- `422` — ретрансляция с таким `{id}` не найдена;\n- `422` — не передан `retrans_server`, либо в адресе нет точки;\n- `422` — не передан `retrans_port`, либо значение не число или вне\n  диапазона 0–65535;\n- `422` — не передан `retrans_protocol` или значение не из списка допустимых;\n- `422` — не передан ни `terminals`, ни `units_groups_ids`;\n- `422` — терминал не найден или нет доступа к нему;\n- `422` — для сервера SKIF не задан `to_imei` либо он совпадает с `imei`;\n- `422` — `imei` повторяется в списке терминалов;\n- `422` — терминал уже ретранслируется на этот же сервер и порт\n  в другой ретрансляции;\n- `422` — ретрансляция зациклена: цепочка терминалов возвращается в себя;\n- `422` — указана недопустимая категория GPS или тип транспорта;\n- `422` — в `units_groups_ids` попал некорректный идентификатор группы;\n- `422` — группа объектов не найдена или нет доступа к ней;\n- `422` — группы объектов принадлежат разным компаниям;\n- `422` — в режиме `units_groups_ids` не удалось определить компанию,\n  `company_id` не передан и прежняя компания неизвестна.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Идентификатор ретрансляции или любого её терминала",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetranslatorRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Обновлённая ретрансляция",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetranslatorChannel"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "description": "Ошибка бизнес-логики",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "code": 4220,
                  "message": "Ретранслятор не найден"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Ретрансляции"
        ],
        "summary": "Удаление ретрансляции",
        "description": "Удаляет ретрансляцию вместе со всеми её терминалами.\n\n---\n\nВ отличие от массового удаления, здесь удаление происходит сразу.\n\n---\n\nРетрансляция отписывается от своих групп объектов, и её терминалы\nперестают ретранслироваться.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\nDELETE /retranslators/eeadc5d1-9a68-4083-bef6-51173d532cb0\n```\n\n---\n\n**Пример ответа:**\n\n``` json\n{}\n```\n\n---\n\n**Ошибки:**\n\n- `422` — ретрансляция с таким `{id}` не найдена;\n- `422` — нет доступа к ретрансляции.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Идентификатор ретрансляции или любого её терминала",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "eeadc5d1-9a68-4083-bef6-51173d532cb0"
          }
        ],
        "responses": {
          "200": {
            "description": "Ретрансляция удалена",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "description": "Ошибка бизнес-логики",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "code": 4220,
                  "message": "Нет доступа"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/retranslators/list": {
      "post": {
        "tags": [
          "Ретрансляции"
        ],
        "summary": "Реестр ретрансляций",
        "description": "Возвращает ретрансляции по фильтру. Нужен для таблицы ретрансляций\nс поиском, сортировкой и постраничным выводом.\n\n---\n\n**Параметры тела запроса:**\n\n- `from` — с какого элемента выдавать результат, по умолчанию `0`;\n- `count` — сколько элементов вернуть, по умолчанию `100000`.\n  Если в выборке участвует несколько компаний, значение ограничивается\n  числом `10000`;\n- `value` — строка поиска. Если она не состоит только из цифр, ищется\n  вхождение в `name`, `retrans_server`, `retrans_protocol` и в IMEI;\n  если состоит из цифр — ищется в IMEI;\n- `field` — уточнение для числового поиска. При `field: \"imei\"` ищется\n  точное совпадение IMEI, иначе — вхождение;\n- `sortField` — поле сортировки, одно из значений\n  \\[`imei`, `is_active`, `retrans_protocol`, `retrans_server`, `name`, `comment`].\n  Если поле не из списка, сортировка не применяется;\n- `sortDesc` — сортировка по убыванию, `true` или `false`;\n- `conditions` — дополнительные условия отбора, массив объектов вида\n  `{\"field\": \"значение\", \"value\": \"значение\"}`. Учитываются поля\n  `imei` и `retrans_server`;\n- `companies` — идентификаторы компаний, по которым ведётся выборка.\n  Пересекается с уже разрешённым набором, а не заменяет его.\n\n---\n\n**Какие компании попадают в выборку:**\n\nреестр работает в рамках активной компании пользователя. Поле `companies`\nможет только сузить выборку внутри неё, вывести ретрансляции других\nдоступных компаний этим методом нельзя. Для выборки сразу по нескольким\nдоступным компаниям используется админский запрос с `model: \"retranslators\"`,\nкоторый отдаёт тот же состав `{max, list}`.\n\n---\n\n**Состав ответа:**\n\n- в ответе ретрансляции собраны по группам: одна ретрансляция — один\n  элемент `list`, сколько бы терминалов за ней ни стояло;\n- в ответе ретрансляций по группам объектов видны их терминалы,\n  сами группы не выводятся;\n- `max` — сколько ретрансляций подошло под фильтр всего, без учёта\n  `from` и `count`. Нужен для постраничной навигации;\n- `activate_date` в реестре не приходит: дату включения видно\n  в `GET /retranslators`.\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\nНайти ретрансляции, у которых IMEI содержит подстроку \"123\",\nи отсортировать по имени\n\n``` json\n{\n    \"from\": 0,\n    \"count\": 20,\n    \"value\": \"123\",\n    \"field\": \"imei\",\n    \"sortField\": \"name\",\n    \"sortDesc\": false\n}\n```\n\n---\n\n**Пример ответа:**\n\n``` json\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"eeadc5d1-9a68-4083-bef6-51173d532cb0\",\n            \"name\": \"Ретрансляция в Эрнис1\",\n            \"comment\": \"Комментарий диспетчера\",\n            \"retrans_protocol\": \"retranslator_wilaon_ips\",\n            \"retrans_server\": \"195.208.1.1\",\n            \"retrans_port\": 9001,\n            \"retrans_pw\": \"1234\",\n            \"is_active\": true,\n            \"activate_date\": null,\n            \"member_name\": \"Иванов И.И.\",\n            \"route_name\": \"Маршрут 15\",\n            \"gps_category_type_key\": \"gps_category_type_s\",\n            \"public_vehicle_type_key\": \"\",\n            \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n            \"imei\": \"862531040000123\",\n            \"to_imei\": \"4324324234\",\n            \"terminals\": [\n                {\n                    \"imei\": \"862531040000123\",\n                    \"to_imei\": \"4324324234\"\n                }\n            ]\n        },\n        {\n            \"id\": \"1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33\",\n            \"name\": \"Ретрансляция на группу объектов\",\n            \"comment\": \"\",\n            \"retrans_protocol\": \"retranslator_egts\",\n            \"retrans_server\": \"195.208.1.1\",\n            \"retrans_port\": 9002,\n            \"retrans_pw\": \"\",\n            \"is_active\": false,\n            \"activate_date\": null,\n            \"company_id\": \"6c1a0092-9f99-4fb0-a2f3-37eb8db08b31\",\n            \"imei\": \"862531040000123\",\n            \"to_imei\": \"862531040000123\",\n            \"terminals\": [\n                {\n                    \"imei\": \"862531040000123\",\n                    \"to_imei\": \"862531040000123\"\n                }\n            ]\n        }\n    ]\n}\n```\n\n---\n\n**Ошибки:**\n\n- `422` — у пользователя нет доступных компаний, либо после фильтрации\n  по `companies` не осталось ни одной.",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "integer",
                    "default": 0,
                    "example": 0,
                    "description": "С какого элемента выдавать результат"
                  },
                  "count": {
                    "type": "integer",
                    "default": 100000,
                    "example": 20,
                    "description": "Сколько ретрансляций вернуть. Если в выборке участвует несколько\nкомпаний, значение ограничивается числом `10000`"
                  },
                  "value": {
                    "type": "string",
                    "example": "123",
                    "description": "Строка поиска. Если она не состоит только из цифр, ищется\nвхождение в `name`, `retrans_server`, `retrans_protocol` и в IMEI;\nесли состоит из цифр — ищется в IMEI"
                  },
                  "field": {
                    "type": "string",
                    "example": "imei",
                    "description": "Уточнение для числового поиска. При `imei` ищется точное\nсовпадение IMEI, иначе — вхождение"
                  },
                  "sortField": {
                    "type": "string",
                    "example": "name",
                    "description": "Поле сортировки, одно из значений\n\\[`imei`, `is_active`, `retrans_protocol`, `retrans_server`,\n`name`, `comment`]. Если поле не из списка, сортировка\nне применяется"
                  },
                  "sortDesc": {
                    "type": "boolean",
                    "default": false,
                    "example": false,
                    "description": "Сортировка по убыванию"
                  },
                  "conditions": {
                    "type": "array",
                    "description": "Дополнительные условия отбора. Учитываются поля `imei`\nи `retrans_server`",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "imei",
                          "description": "Поле условия"
                        },
                        "value": {
                          "type": "string",
                          "example": "123",
                          "description": "Значение условия"
                        }
                      }
                    }
                  },
                  "companies": {
                    "type": "array",
                    "description": "Компании, по которым ведётся выборка. Пересекается со списком\nдоступных компаний, а не заменяет его",
                    "items": {
                      "type": "string",
                      "format": "uuid",
                      "example": "6c1a0092-9f99-4fb0-a2f3-37eb8db08b31"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Реестр ретрансляций",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "max": {
                      "type": "integer",
                      "example": 2,
                      "description": "Всего ретрансляций под фильтр, без учёта `from` и `count`"
                    },
                    "list": {
                      "type": "array",
                      "description": "Ретрансляции текущей страницы",
                      "items": {
                        "$ref": "#/components/schemas/RetranslatorChannel"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "description": "Ошибка бизнес-логики",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "code": 4220,
                  "message": "У пользователя нет компаний"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/retranslators/{id}/logs": {
      "post": {
        "tags": [
          "Ретрансляции"
        ],
        "summary": "Журнал ретрансляции",
        "description": "Возвращает журнал передачи данных ретрансляции за выбранный период:\nчто уходило на сервер, с каким статусом и в каком тексте.\n\n---\n\n**Параметры тела запроса:**\n\n- `from` — начало периода, обязательный параметр,\n  формат `yyyy-MM-dd HH:mm:ss`;\n- `to` — конец периода, обязательный параметр,\n  формат `yyyy-MM-dd HH:mm:ss`;\n- `max` — сколько записей вернуть, по умолчанию `100`, максимум `500`;\n- `offset` — с какой записи начинать выдачу, по умолчанию `0`;\n- `timezone_key` — часовой пояс, в котором трактуются `from` и `to`.\n  Формат `UTC+3`. По умолчанию берётся часовой пояс текущей компании.\n  Время в ответе возвращается уже в этом поясе;\n- `imeis` — список IMEI, по которым нужен журнал, например при разборе\n  одного терминала из ретрансляции. Если не передан, берётся первый\n  терминал самой ретрансляции.\n\n---\n\nТерминалы ретрансляции сопоставляются по правилам ретрансляции: если у\nтерминала задан `to_imei`, в журнале ищется именно он, а не исходный IMEI.\n\n---\n\nВыборка идёт по данным, которые ретрансляция отправила на свой сервер, плюс\nзаписи без указания сервера.\n\n---\n\n**Состав ответа:**\n\n- `columns` — описание колонок таблицы, чтобы интерфейсу не держать\n  заголовки у себя: массив объектов `{key, name}`;\n- `rows` — сами записи, от свежих к старым. В каждой записи\n  `datetime`, `imei`, `is_error`, `text` и `server`;\n- `max_rows` — сколько записей попало в период всего, без учёта\n  `max` и `offset`. Нужен для постраничной навигации.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nЖурнал всей ретрансляции за сутки\n\n``` json\n{\n    \"from\": \"2026-08-27 00:00:00\",\n    \"to\": \"2026-08-28 00:00:00\",\n    \"max\": 100,\n    \"offset\": 0,\n    \"timezone_key\": \"UTC+3\"\n}\n```\n\nЖурнал одного терминала ретрансляции\n\n``` json\n{\n    \"from\": \"2026-08-27 00:00:00\",\n    \"to\": \"2026-08-28 00:00:00\",\n    \"imeis\": [\n        \"862531040000001\"\n    ]\n}\n```\n\n---\n\n**Пример ответа:**\n\n``` json\n{\n    \"columns\": [\n        {\n            \"key\": \"datetime\",\n            \"name\": \"Дата\"\n        },\n        {\n            \"key\": \"imei\",\n            \"name\": \"IMEI\"\n        },\n        {\n            \"key\": \"is_error\",\n            \"name\": \"Статус\"\n        },\n        {\n            \"key\": \"text\",\n            \"name\": \"Сообщение\"\n        }\n    ],\n    \"rows\": [\n        {\n            \"datetime\": \"2026-08-27 21:45:12\",\n            \"imei\": \"4324324234\",\n            \"is_error\": false,\n            \"text\": \"Отправлено точек: 1\",\n            \"server\": \"195.208.1.1\"\n        },\n        {\n            \"datetime\": \"2026-08-27 21:40:03\",\n            \"imei\": \"4324324234\",\n            \"is_error\": true,\n            \"text\": \"Соединение отклонено сервером\",\n            \"server\": \"195.208.1.1\"\n        }\n    ],\n    \"max_rows\": 2\n}\n```\n\n---\n\n**Ошибки:**\n\n- `422` — ретрансляция с таким `{id}` не найдена;\n- `422` — нет доступа к ретрансляции;\n- `422` — не передан `from` или `to`;\n- `422` — дата указана в неверном формате;\n- `422` — `max` больше 500;\n- `422` — ретрансляция без терминалов, журнал брать нечего;\n- `422` — ни один из переданных в `imeis` не принадлежит этой ретрансляции.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Идентификатор ретрансляции или любого её терминала",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "eeadc5d1-9a68-4083-bef6-51173d532cb0"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2026-08-27 00:00:00",
                    "description": "Начало периода, формат `yyyy-MM-dd HH:mm:ss`. Обязательное поле"
                  },
                  "to": {
                    "type": "string",
                    "example": "2026-08-28 00:00:00",
                    "description": "Конец периода, формат `yyyy-MM-dd HH:mm:ss`. Обязательное поле"
                  },
                  "max": {
                    "type": "integer",
                    "default": 100,
                    "maximum": 500,
                    "example": 100,
                    "description": "Сколько записей вернуть"
                  },
                  "offset": {
                    "type": "integer",
                    "default": 0,
                    "example": 0,
                    "description": "С какой записи начинать выдачу"
                  },
                  "timezone_key": {
                    "type": "string",
                    "example": "UTC+3",
                    "description": "Часовой пояс, в котором трактуются `from` и `to`, вида `UTC+3`.\nПо умолчанию — часовой пояс текущей компании"
                  },
                  "imeis": {
                    "type": "array",
                    "description": "IMEI, по которым нужен журнал. Если не передан, берётся первый\nтерминал ретрансляции",
                    "items": {
                      "type": "string",
                      "example": "862531040000001"
                    }
                  }
                },
                "required": [
                  "from",
                  "to"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Журнал ретрансляции",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "columns": {
                      "type": "array",
                      "description": "Описание колонок таблицы",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "example": "datetime",
                            "description": "Ключ колонки"
                          },
                          "name": {
                            "type": "string",
                            "example": "Дата",
                            "description": "Заголовок колонки"
                          }
                        }
                      }
                    },
                    "rows": {
                      "type": "array",
                      "description": "Записи журнала, от свежих к старым",
                      "items": {
                        "type": "object",
                        "properties": {
                          "datetime": {
                            "type": "string",
                            "example": "2026-08-27 21:45:12",
                            "description": "Время записи"
                          },
                          "imei": {
                            "type": "string",
                            "example": "4324324234",
                            "description": "IMEI, на который уходили данные"
                          },
                          "is_error": {
                            "type": "boolean",
                            "example": false,
                            "description": "Признак ошибки"
                          },
                          "text": {
                            "type": "string",
                            "example": "Отправлено точек: 1",
                            "description": "Текст записи"
                          },
                          "server": {
                            "type": "string",
                            "example": "195.208.1.1",
                            "description": "Сервер ретрансляции"
                          }
                        }
                      }
                    },
                    "max_rows": {
                      "type": "integer",
                      "example": 2,
                      "description": "Всего записей за период, без учёта `max` и `offset`"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "description": "Ошибка бизнес-логики",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "code": 4220,
                  "message": "Укажите from"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/retranslator_histories": {
      "post": {
        "tags": [
          "Ретрансляция исторических данных"
        ],
        "summary": "Запуск исторической ретрансляции данных",
        "description": "**Добавление ретрансляции исторических данных**\n\n---\n\nПоля в JSON:\n\nimei - IMEI объекта\n\nterminal_type - ключ типа протокола объекта.\n\nname - имя объекта.\n\ncomment - комментарий.\n\nretrans_from - период ретрансляции от в формате yyyy-MM-dd HH:mm:ss\n\nretrans_to - период ретрансляции до.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\nPOST [https://api.skif.pro/api_v1/retranslator_histories](https://api.skif.pro/api_v1/retranslator_histories)\n\n``` json\n{\n    \"imei\": \"324235243242354\",\n    \"terminal_type\": \"navtelecom\",\n    \"name\": \"Ретранслятор 1234\",\n    \"unit_name\": \"Man 922\",\n    \"comment\": \"Комментария 456\",\n    \"retrans_from\": \"2023-10-12 11:41:55\",\n    \"retrans_to\": \"2023-10-13 12:44:30\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nЕсли запрос успешен, тогда возвращается соозданная запись, иначе ошибка.\n\n``` json\n{\n    \"id\": \"435aa261-d06a-422b-b64c-1ee94b447c9e\",\n    \"imei\": \"324235243242354\",\n    \"name\": \"Ретранслятор 1234\",\n    \"unit_name\": \"Man 922\",\n    \"terminal_type\": \"navtelecom\",\n    \"comment\": \"Комментария 456\",\n    \"retrans_from\": \"2023-10-12 11:41:55\",\n    \"retrans_to\": \"2023-10-13 12:44:30\",\n    \"status\": \"WAITING\"\n}\n\n ```",
        "operationId": "retranslatorHistories",
        "parameters": [
          {
            "name": "cookie",
            "in": "header",
            "schema": {
              "type": "string",
              "example": "__ddg1_=iXH59Du4QaAkZvHblGsa; rl_user_id=%22RudderEncrypt%3AU2FsdGVkX19i1MKLt0JXuvb8mt%2F6JCYaI%2BBDpJcnGlWTJD%2FDXtOrgxRHWt6raUeL%22; PLAY_SESSION={{vault:json-web-token}}"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "comment": {
                    "type": "string",
                    "example": "Комментария 456"
                  },
                  "imei": {
                    "type": "string",
                    "example": "324235243242354"
                  },
                  "name": {
                    "type": "string",
                    "example": "Ретранслятор 1234"
                  },
                  "retrans_from": {
                    "type": "string",
                    "example": "2023-10-14 11:41:55"
                  },
                  "retrans_to": {
                    "type": "string",
                    "example": "2023-10-18 12:44:30"
                  },
                  "terminal_type": {
                    "type": "string",
                    "example": "navtelecom"
                  },
                  "unit_name": {
                    "type": "string",
                    "example": "Man 922"
                  }
                }
              },
              "examples": {
                "/retranslator_histories": {
                  "value": {
                    "comment": "Комментария 456",
                    "imei": "324235243242354",
                    "name": "Ретранслятор 1234",
                    "retrans_from": "2023-10-14 11:41:55",
                    "retrans_to": "2023-10-18 12:44:30",
                    "terminal_type": "navtelecom",
                    "unit_name": "Man 922"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min"
      }
    },
    "/api_v1/commands": {
      "get": {
        "tags": [
          "Команды терминалов"
        ],
        "summary": "/commands?ids=:ids",
        "description": "**Поиск команд по ID**\n\n---\n\nВозвращает массив команд по ID.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретная команда.\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n/commands?ids=8d174fc8-57c8-4a35-9347-0dba76c04957\n\n ```\n\nПример ответа:\n\n```\n{\n    \"id\": \"8d174fc8-57c8-4a35-9347-0dba76c04957\",\n    \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n    \"imei\": \"862531040000003\",\n    \"command\": \"command three\",\n    \"status\": \"WAITING\"\n}\n\n ```",
        "operationId": "commandsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Команды терминалов"
        ],
        "summary": "/commands",
        "description": "**Добавление новой команды**\n\n---\n\n**Параметры:**\n\n\"company_id\": ID компании, обязательно для дилера. Для компании необязательно - получается активная компания.  \n\"imei\": Imei, текст, обязательно.  \n\"command\": Команда, обязательно для дилера, для компании нет.  \n\"template\": шаблон команды, обязательно для компании.\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Пример запроса:**\n\n1) Создание команды дилером\n\n---\n\n```\n{\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"862531040000013\",\n    \"commnad\": \"*?V\"\n}\n\n ```\n\nВозвращается созданная запись\n\nstatus - статус отправки команды. Возможные значения: WAITING - в ожидании, OK - отправлена, FAIL - не удалось отправить.  \nПример ответа:\n\n```\n{\n    \"id\": \"7d7bb072-9daf-4142-9b03-3efea7265a73\",\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"862531040000013\",\n    \"commnad\": \"*?V\",\n    \"status\": \"WAITING\"\n}\n\n ```\n\n---\n\n2) Создание команды в компании\n\n```\n{\n    \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n    \"imei\": \"862531040000013\",\n    \"template\": {\n        \"id\": \"eede4765-273c-45da-b2c6-8b331d532402\", // ID шаблонов команд\n        \"params_values\": [ // значения параметров\n            {\"key\": \"Номер выхода\", \"value\": \"2\"}\n        ]\n    }\n}\n\n ```\n\nОтвет:\n\n```\n{\n    \"id\": \"cc584df9-791b-4074-af7e-6bc319be6173\",\n    \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n    \"imei\": \"862531040000013\",\n    \"command\": \"*!2N\",\n    \"status\": \"WAITING\",\n    \"user_id\": \"6e8f4833-c430-4509-ac5e-e1802691655c\",\n    \"template\": {\n        \"id\": \"eede4765-273c-45da-b2c6-8b331d532402\",\n        \"name\": \"Выключения выходной линии\",\n        \"params_values\": [\n            {\n                \"key\": \"Номер выхода\",\n                \"value\": \"2\"\n            }\n        ]\n    }\n}\n\n ```",
        "operationId": "commands",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "command": {
                    "type": "string",
                    "example": "*?V"
                  },
                  "company_id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "imei": {
                    "type": "string",
                    "example": "862531040000013"
                  }
                }
              },
              "examples": {
                "/commands": {
                  "value": {
                    "command": "*?V",
                    "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "imei": "862531040000013"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/commands_bulk": {
      "post": {
        "tags": [
          "Команды терминалов"
        ],
        "summary": "/commands_bulk",
        "description": "**Добавить новую команду для нескольких терминалов**\n\n---\n\n**Параметры:**\n\n\"imeis\": Список Imei, текст массив.  \n\"command\": Команда, обязательно для дилера, для компании нет.  \n\"template\": Шаблон команды, обязательно для компании.\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Пример запроса:**\n\n**1) Создание команды дилером**\n\n---\n\n```\n{\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imeis\": [\"862531040000013\", \"862531040000014\"],\n    \"commnad\": \"*?V\"\n}\n\n ```\n\nВозвращается созданные записи\n\nstatus - статус отправки команды. Возможные значения: WAITING - в ожидании, OK - отправлена, FAIL - не удалось отправить  \nПример ответа:\n\n```\n[\n    {\n    \"id\": \"7d7bb072-9daf-4142-9b03-3efea7265a73\",\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"862531040000013\",\n    \"commnad\": \"*?V\",\n    \"status\": \"WAITING\"\n  },\n  {\n    \"id\": \"7d7bb072-9daf-4142-9b03-3efea7265a73\",\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"862531040000013\",\n    \"commnad\": \"*?V\",\n    \"status\": \"WAITING\"\n  }\n]\n\n ```\n\n---\n\n**2) Создание команды в компании**\n\n```\n{\n    \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n    \"imeis\": [\"862531040000013\", \"862531040000014\"],\n    \"template\": {\n        \"id\": \"eede4765-273c-45da-b2c6-8b331d532402\",\n        \"params_values\": [\n            {\"key\": \"Номер выхода\", \"value\": \"2\"}\n        ]\n    }\n}\n\n ```\n\nОтвет:\n\n```\n[\n    {\n    \"id\": \"7d7bb072-9daf-4142-9b03-3efea7265a73\",\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"862531040000013\",\n    \"commnad\": \"*?V\",\n    \"status\": \"WAITING\"\n  },\n  {\n    \"id\": \"7d7bb072-9daf-4142-9b03-3efea7265a73\",\n    \"company_id\": \"a786d1e0-5cc2-4e3d-a1f6-2c8ae06f9a39\",\n    \"imei\": \"862531040000013\",\n    \"commnad\": \"*?V\",\n    \"status\": \"WAITING\"\n  }\n]\n\n ```",
        "operationId": "commandsBulk",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company_id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "imei": {
                    "type": "string",
                    "example": "862531040000013"
                  },
                  "template": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "eede4765-273c-45da-b2c6-8b331d532402"
                      },
                      "params_values": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "Номер выхода"
                            },
                            "value": {
                              "type": "string",
                              "example": "2"
                            }
                          }
                        },
                        "example": [
                          {
                            "key": "Номер выхода",
                            "value": "2"
                          }
                        ]
                      }
                    }
                  }
                }
              },
              "examples": {
                "/commands_bulk": {
                  "value": {
                    "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "imei": "862531040000013",
                    "template": {
                      "id": "eede4765-273c-45da-b2c6-8b331d532402",
                      "params_values": [
                        {
                          "key": "Номер выхода",
                          "value": "2"
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/commands/{id}": {
      "put": {
        "tags": [
          "Команды терминалов"
        ],
        "summary": "/commands/:id",
        "description": "**Обновить данные команды**\n\n---\n\nОбновляет переданные параметры\n\n---\n\n**Параметры:**\n\nсм метод POST /commands\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /commands?ids=:id",
        "operationId": "commandsId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "command": {
                    "type": "string",
                    "example": "*?V"
                  },
                  "company_id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "id": {
                    "type": "string",
                    "example": "68c00e05-a462-4b93-9698-ab411003aa1f"
                  },
                  "imei": {
                    "type": "string",
                    "example": "862531040000012"
                  },
                  "sent_time": {
                    "type": "string",
                    "example": "2022-02-11 15:39:26"
                  },
                  "status": {
                    "type": "string",
                    "example": "FAIL"
                  }
                }
              },
              "examples": {
                "/commands/:id": {
                  "value": {
                    "command": "*?V",
                    "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "id": "68c00e05-a462-4b93-9698-ab411003aa1f",
                    "imei": "862531040000012",
                    "sent_time": "2022-02-11 15:39:26",
                    "status": "FAIL"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Команды терминалов"
        ],
        "summary": "/commands/:id",
        "description": "**Удаление команды по ее id**\n\n---\n\nУдаляет команду\n\n---\n\n**Параметры:**\n\nid записи\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Ответ:** 200\n\nЕсли команда с таким id не найдена, то возвращается ошибка 422\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "commandsId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID записи"
        }
      ]
    },
    "/api_v1/commands/list": {
      "post": {
        "tags": [
          "Команды терминалов"
        ],
        "summary": "/commands/list",
        "description": "**Поиск команды по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nзначения для field - imei\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Пример запроса:**\n\nПолучить первые 2 команды для imei\n\n```\n{\n    \"from\": 0,\n    \"count\": 2,\n    \"conditions\": [\n        {\n            \"field\": \"imei\",\n            \"value\": \"862531040000015\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"9fa4bb38-c4da-4339-8c27-eac652363c63\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"imei\": \"862531040000015\",\n            \"command\": \"command xyz\", //Команда\n            \"status\": \"SENT\", //Статус\n            \"answer\": \"*@С\" // Ответ\n        },\n        {\n            \"id\": \"72019dff-e056-4137-86f8-19e790d3067b\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"imei\": \"862531040000015\",\n            \"command\": \"command abc\",\n            \"status\": \"FAIL\"\n        },\n        {\n            \"id\": \"1630c5b2-4e1d-447a-9102-97f6eb5ddf47\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"imei\": \"862531040000015\",\n            \"command\": \"command abc\",\n            \"status\": \"WAITING\"\n        }\n    ]\n}\n\n ```",
        "operationId": "commandsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "imei"
                        },
                        "value": {
                          "type": "string",
                          "example": "862531040000013"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "imei",
                        "value": "862531040000013"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/commands/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "imei",
                        "value": "862531040000013"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/commands_templates": {
      "get": {
        "tags": [
          "Шаблоны команд терминалов"
        ],
        "summary": "/commands_templates?ids=:ids",
        "description": "**Получение шаблонов команд по ID**\n\n---\n\nВозвращает шаблоны команд.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретный шаблон команды.\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n/commands_templates?ids=edfd0b85-b056-4726-9762-fa63dc61efd2\n\n ```\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"edfd0b85-b056-4726-9762-fa63dc61efd2\",\n    \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n    \"terminal_type\": \"navtelecom\",\n    \"name\": \"Команда произвольной звуковой индикации зуммером\",\n    \"command_template\": \"*!BEEP {Кол-во импульсов в каждом такте},{Кол-во тактов в звуковой индикации},{Длительность каждого такта в 1/128 долях секунды.},{Частота звуковой индикации (Гц)}\",\n    \"params\": [\n        \"Кол-во импульсов в каждом такте\",\n        \"Кол-во тактов в звуковой индикации\",\n        \"Длительность каждого такта в 1/128 долях секунды.\",\n        \"Частота звуковой индикации (Гц)\"\n    ]\n}\n\n ```",
        "operationId": "commandsTemplatesIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "60 req/min"
      },
      "post": {
        "tags": [
          "Шаблоны команд терминалов"
        ],
        "summary": "/commands_templates",
        "description": "**Добавление нового шаблона команды**\n\n---\n\n**Параметры:**  \n\"name\": Название шаблона команды.  \n\"terminal_type\": Тип терминала.  \n\"command_template\": Шаблон команды.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"name\": \"Команда произвольной звуковой индикации зуммером\",\n    \"terminal_type\": \"navtelecom\",\n    \"command_template\": \"*!BEEP {Кол-во импульсов в каждом такте},{Кол-во тактов в звуковой индикации},{Длительность каждого такта в 1/128 долях секунды.},{Частота звуковой индикации (Гц)}\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданная запись\n\n```\n{\n    \"id\": \"edfd0b85-b056-4726-9762-fa63dc61efd2\",\n    \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n    \"terminal_type\": \"navtelecom\",\n    \"name\": \"Команда произвольной звуковой индикации зуммером\",\n    \"command_template\": \"*!BEEP {Кол-во импульсов в каждом такте},{Кол-во тактов в звуковой индикации},{Длительность каждого такта в 1/128 долях секунды.},{Частота звуковой индикации (Гц)}\",\n    \"params\": [\n        \"Кол-во импульсов в каждом такте\",\n        \"Кол-во тактов в звуковой индикации\",\n        \"Длительность каждого такта в 1/128 долях секунды.\",\n        \"Частота звуковой индикации (Гц)\"\n    ]\n}\n\n ```",
        "operationId": "commandsTemplates",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "command_template": {
                    "type": "string",
                    "example": "*!BEEP {Кол-во импульсов в каждом такте},{Кол-во тактов в звуковой индикации},{Длительность каждого такта в 1/128 долях секунды.},{Частота звуковой индикации (Гц)}"
                  },
                  "name": {
                    "type": "string",
                    "example": "Команда произвольной звуковой индикации зуммером"
                  },
                  "terminal_type": {
                    "type": "string",
                    "example": "navtelecom"
                  }
                }
              },
              "examples": {
                "/commands_templates": {
                  "value": {
                    "command_template": "*!BEEP {Кол-во импульсов в каждом такте},{Кол-во тактов в звуковой индикации},{Длительность каждого такта в 1/128 долях секунды.},{Частота звуковой индикации (Гц)}",
                    "name": "Команда произвольной звуковой индикации зуммером",
                    "terminal_type": "navtelecom"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/commands_templates/{id}": {
      "put": {
        "tags": [
          "Шаблоны команд терминалов"
        ],
        "summary": "/commands_templates/:id",
        "description": "**Обновить данные шаблона команды**\n\n---\n\n**Параметры:**\n\nid - ID шаблона команды  \nсм метод POST /commands_templates\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен GET /commands_templates?ids=:id",
        "operationId": "commandsTemplatesId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "command": {
                    "type": "string",
                    "example": "*?V"
                  },
                  "company_id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "id": {
                    "type": "string",
                    "example": "68c00e05-a462-4b93-9698-ab411003aa1f"
                  },
                  "imei": {
                    "type": "string",
                    "example": "862531040000012"
                  },
                  "sent_time": {
                    "type": "string",
                    "example": "2022-02-11 15:39:26"
                  },
                  "status": {
                    "type": "string",
                    "example": "FAIL"
                  }
                }
              },
              "examples": {
                "/commands_templates/:id": {
                  "value": {
                    "command": "*?V",
                    "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "id": "68c00e05-a462-4b93-9698-ab411003aa1f",
                    "imei": "862531040000012",
                    "sent_time": "2022-02-11 15:39:26",
                    "status": "FAIL"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Шаблоны команд терминалов"
        ],
        "summary": "/commands_templates/:id",
        "description": "**Удаление шаблона команды по его id**\n\n---\n\n**Параметры:**\n\nid записи\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Ответ: 200**\n\nЕсли команда с таким id не найдена, то возвращается ошибка 422.\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "commandsTemplatesId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор сущности (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "d15c7fa3-67c1-4b11-a83d-3b7c4d5e6f7a"
            }
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID шаблона команды"
        }
      ]
    },
    "/api_v1/commands_templates/list": {
      "post": {
        "tags": [
          "Шаблоны команд терминалов"
        ],
        "summary": "/commands_templates/list",
        "description": "**Поиск шаблонов комманд по фильтру**\n\n---\n\nАналогично запросу POST /users/list\n\n---\n\n**Параметры:**\n\nfrom - с какого найденного элемента выдавать результат.\n\ncount - максимальное число элементов.\n\nconditions - условие отбора в виде массива \\[ {\"field\":\"значение\", \"value\":\"значение\"}, {... и т.д. ...} \\].  \nВозможные значения для field - terminal_type, name\n\n---\n\n**Роль:** Оператор и выше.\n\n---\n\nПримеры:\n\n**1) Получение всех шаблонов команд дилера**\n\n```\n{}\n\n ```\n\nПример ответа:\n\n```\n{\n    \"max\": 3,\n    \"list\": [\n        {\n            \"id\": \"b6f555e8-4c69-4545-9639-44ef56bb1db5\",\n            \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n            \"terminal_type\": \"navtelecom\",\n            \"name\": \"Включения выходной линии\",\n            \"command_template\": \"*!{Номер выхода}Y\",\n            \"params\": [\n                \"Номер выхода\"\n            ]\n        },\n        {\n            \"id\": \"eede4765-273c-45da-b2c6-8b331d532402\",\n            \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n            \"terminal_type\": \"navtelecom\",\n            \"name\": \"Выключения выходной линии\",\n            \"command_template\": \"*!{Номер выхода}N\",\n            \"params\": [\n                \"Номер выхода\"\n            ]\n        },\n        {\n            \"id\": \"b91c6a18-5965-46d4-acbe-e164d4dbf11a\",\n            \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n            \"terminal_type\": \"navtelecom\",\n            \"name\": \"Запрос модели и версии устройства\",\n            \"command_template\": \"*?V\",\n            \"params\": []\n        }\n    ]\n}\n\n ```\n\n**2) Получение первых 2 шаблонов команд для navtelecom.**\n\n```\n{\n    \"from\": 0,\n    \"count\": 2,\n    \"conditions\": [\n        {\n            \"field\": \"terminal_type\",\n            \"value\": \"navtelecom\"\n        }\n    ]\n}\n\n ```\n\nОтвет:\n\n```\n{\n    \"max\": 3,\n    \"list\": [\n        {\n            \"id\": \"b6f555e8-4c69-4545-9639-44ef56bb1db5\",\n            \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n            \"terminal_type\": \"navtelecom\",\n            \"name\": \"Включения выходной линии\",\n            \"command_template\": \"*!{Номер выхода}Y\",\n            \"params\": [\n                \"Номер выхода\"\n            ]\n        },\n        {\n            \"id\": \"eede4765-273c-45da-b2c6-8b331d532402\",\n            \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n            \"terminal_type\": \"navtelecom\",\n            \"name\": \"Выключения выходной линии\",\n            \"command_template\": \"*!{Номер выхода}N\",\n            \"params\": [\n                \"Номер выхода\"\n            ]\n        }\n    ]\n}\n\n ```",
        "operationId": "commandsTemplatesList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "terminal_type"
                        },
                        "value": {
                          "type": "string",
                          "example": "navtelecom"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "terminal_type",
                        "value": "navtelecom"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 2
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  }
                }
              },
              "examples": {
                "/commands_templates/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "terminal_type",
                        "value": "navtelecom"
                      }
                    ],
                    "count": 2,
                    "from": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/dealers": {
      "get": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers?ids=:ids",
        "description": "**Поиск дилера по ID**\n\n---\n\nВозвращает массив дилеров по ID.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретный интергатор.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n/dealers?ids=8ce34b65-49da-4bac-bbce-379da83e9638\n\n ```\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"8ce34b65-49da-4bac-bbce-379da83e9638\",\n    \"type\": {\n        \"key\": \"legal_entity\",\n        \"type\": \"dealer_types\",\n        \"value\": \"Юридическое лицо\"\n    },\n    \"inn\": \"7701234567\",\n    \"phone\": \"+7899323236\",\n    \"email\": \"email@skif.com\",\n    \"contact_person\": \"Ivanov Ivan\",\n    \"name\": \"СКИФ ЭПП\",\n    \"server\": \"212.158.160.177\",\n    \"sms_tariff\": 1000,\n    \"address\": \"Лининский проспект, 116к1, Москва, 119415\",\n    \"services\": \"Мониторинг транспорта\",\n    \"tariff_description\": \"от 200 руб/мес за 1 объект\",\n    \"billing\": {\n        \"merchant\": \"111222333\",\n        \"system\": \"MODULBANK\",\n        \"key\": \"key123xyz\",\n        \"default_unit_price\": 260,\n        \"default_trial_length_days\": 10,\n        \"default_period_length_days\": 30,\n        \"qr_unit_price\": 270,\n        \"qr_trial_length_days\": 20,\n        \"qr_period_length_days\": 40,\n        \"public_offer_path\": \"/files/dealer_offer/1933792985_8ce34b65-49da-4bac-bbce-379da83e9638.pdf\"\n    },\n    \"is_default\": false,\n    \"telegram_bot_token\": \"6734990111:RTF6Tik5\"\n}\n\n ```",
        "operationId": "dealersIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Supervisor"
      },
      "post": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers",
        "description": "**Создание нового дилера**\n\n---\n\n**Параметры:**\n\n```\n\"type\": Тип организации: “Юридическое лицо” или “Индивидуальный предприниматель”. Справочник с типом    'dealer_types'\n\"name\": Название, строка, обязательно. С таким названием создается компания\n\"email\": Email, строка, обязательно\n\"inn\": ИНН, строка, обязательно\n\"phone\": Телефон контактного центра, строка, обязательно\n\"contact_person\": Контактное лицо, строка, обязательно\n\"is_default\": true, если интегратор по умолчанию, его нельзя удалить.  Нельзя сделать дилера по умолчанию\n\"password\": Пароль\n\"sms_tariff\": Количество доступных SMS для уведоиления за месяц,\n\"address\": Адрес,\n\"services\": Услуги,\n\"tariff_description\": Описание тарифа\n\"telegram_bot_token\": Токен для телеграм бот\n\n ```\n\n---\n\n**Пример запроса:**\n\n```\n{\ntype': {'key': 'legal_entity'}\n\"name\": \"ООО \"ТехноЛогистика\",\n\"email\": \"support@example.com\",\n\"inn\": \"7701234567\",\n\"phone\": \"+79990000001\",\n\"contact_person\": \"Иванов Иван Иванович\",\n\"address\": \"г. Москва, ул. Складская, д. 10\",\n\"services\": \"Мониторинг транспорта\",\n\"tariff_description\": \"от 200 руб/мес за 1 объект\",\n\"telegram_bot_token\": \"6734990111:RTF6Tik\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращается созданная запись.\n\n```\n{\n\"id\": \"8ce34b65-49da-4bac-bbce-379da83e9638\",\n\"type\": {\"key\": \"legal_entity\", \"value\": \"Юридическое лицо\", \"type\": \"dealer_types\"}\n\"is_default\": false,\n\"name\": \"ООО \"ТехноЛогистика\"\",\n\"inn\": \"7701234567\",\n\"phone\": \"+79990000001\",\n\"email\": \"support@example.com\",\n\"contact_person\": \"Иванов Иван Иванович\",\n\"address\": \"Лининский проспект, 116к1, Москва, 119415\",\n\"services\": \"Мониторинг транспорта\",\n\"tariff_description\": \"от 200 руб/мес за 1 объект\",\n\"telegram_bot_token\": \"6734990111:RTF6Tik5\"\n}\n\n ```",
        "operationId": "dealers",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "address": {
                    "type": "string",
                    "example": "Лининский проспект, 116к1, Москва, 119415"
                  },
                  "contact_person": {
                    "type": "string",
                    "example": "Иванов Иван Иванович"
                  },
                  "email": {
                    "type": "string",
                    "example": "vegeho71508@epeva.com"
                  },
                  "inn": {
                    "type": "string",
                    "example": "364322233444512"
                  },
                  "name": {
                    "type": "string",
                    "example": "ООО \"АвтоТранс\""
                  },
                  "password": {
                    "type": "string",
                    "example": "123456aa"
                  },
                  "phone": {
                    "type": "string",
                    "example": "+7999000000134"
                  },
                  "services": {
                    "type": "string",
                    "example": "Мониторинг транспорта"
                  },
                  "tariff_description": {
                    "type": "string",
                    "example": "от 200 руб/мес за 1 объект"
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "legal_entity"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/dealers": {
                  "value": {
                    "address": "Лининский проспект, 116к1, Москва, 119415",
                    "contact_person": "Иванов Иван Иванович",
                    "email": "vegeho71508@epeva.com",
                    "inn": "364322233444512",
                    "name": "ООО \"АвтоТранс\"",
                    "password": "123456aa",
                    "phone": "+7999000000134",
                    "services": "Мониторинг транспорта",
                    "tariff_description": "от 200 руб/мес за 1 объект",
                    "type": {
                      "key": "legal_entity"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "parameters": []
      }
    },
    "/api_v1/dealers/invite": {
      "post": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers/invite",
        "description": "**Приглашение к дилеру**\n\n---\n\n**Параметры:**\n\n'email' - приглашаемая электронная почта\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n\"email\": \"abc@mail.com\"\n}\n\n ```\n\nВозвращается OK если такоq email не зарегистрован в системе и правильный email, иначе ошибка со статусом 422&  \nСсылка в писmме на почту направляет на стрaницу /register?invite_id=&email=",
        "operationId": "dealersInvite",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "gopixo6537@epeva.com"
                  }
                }
              },
              "examples": {
                "/dealers/invite": {
                  "value": {
                    "email": "gopixo6537@epeva.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "parameters": []
      }
    },
    "/api_v1/registrate_dealer": {
      "post": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/registrate_dealer",
        "description": "**Регистрация дилера**\n\n---\n\n**Параметры:**\n\n```\n\"type\": Тип организации: “Юридическое лицо” или “Индивидуальный предприниматель”. Справочник с типом    'dealer_types'\n\"name\": Название компании, строка, обязательно. С таким названием создается компания.\n\"email\": Email, строка, обязательно\n\"inn\": ИНН, строка, обязательно\n\"phone\": Телефон контактного центра, строка, обязательно\n\"contact_person\": Контактное лицо, строка, обязательно\n\"is_default\": true, если интегратор по умолчанию, его нельзя удалить.  Нелзя сделать интегратора по умолчанию\n\"password\": Пароль\n\"captcha\" - код с картинки получамой методом GET /captcha\n\n ```\n\n---\n\n**Пример запроса:**\n\n```\n{\n\"type\": {\"key\": \"legal_entity\"}\n\"name\": \"ООО \"ТехноЛогистика\",\n\"email\": \"support@example.com\",\n\"inn\": \"7701234567\",\n\"phone\": \"+79990000001\",\n\"contact_person\": \"Иванов Иван Иванович\",\n\"capcha\": \"atxgs\"\n}\n\n ```\n\n---\n\n**Пример ответа:**  \nКод 200 и пустой body в случае успеха.  \nЕсли уже есть аккаунт (см. /approve) с таким email возращается код 422 и body c ошибкой session.errors.emailAlreadyRegistered  \nВ случае частого вызова метода, а именно чаще чем раз в 30 секунд возвращаем код 400 и body validation.errors.often_request",
        "operationId": "registrateDealer",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contact_person": {
                    "type": "string",
                    "example": "Иванов Иван Иванович"
                  },
                  "email": {
                    "type": "string",
                    "example": "support@example.com"
                  },
                  "inn": {
                    "type": "string",
                    "example": "111222334454"
                  },
                  "name": {
                    "type": "string",
                    "example": "ООО \"Новая Скиф\""
                  },
                  "password": {
                    "type": "string",
                    "example": "12345A"
                  },
                  "phone": {
                    "type": "string",
                    "example": "+799900000017"
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "legal_entity"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/registrate_dealer": {
                  "value": {
                    "contact_person": "Иванов Иван Иванович",
                    "email": "support@example.com",
                    "inn": "111222334454",
                    "name": "ООО \"Новая Скиф\"",
                    "password": "12345A",
                    "phone": "+799900000017",
                    "type": {
                      "key": "legal_entity"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "parameters": []
      }
    },
    "/api_v1/dealer/{inn}": {
      "get": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealer/:inn",
        "description": "**Получение общедоступной информации дилера по ИНН**\n\n---\n\nВозвращает объект дилера по ИНН.\n\nЕсли такой дилер не найден, то приходит ошибка с кодом 422, а в теле ответа:\n\n```\n{\"code\":4220,\"field\":\"\",\"message\":\"Не найден такой дилер\"}\n\n ```\n\n---\n\n**Пример запроса:**\n\n```\nGET /api_v1/dealer/364322233444512\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"name\": \"ООО \\\"Рога и Копыта\\\"\", //Имя\n    \"type\": { //Тип организации,key=legal_entity для Юридическое лицо, key=individual_entrepreneur для\n Индивидуальный предприниматель\n                 \"key\": \"legal_entity\",\n        \"type\": \"dealer_types\",\n        \"value\": \"Юридическое лицо\"\n    },\n    \"inn\": \"7701234567\", // ИНН\n    \"address\": \"г. Москва, ул. Складская, д. 10\",//Адрес\n    \"services\": \"Мониторинг транспорта\",//Услуги\n    \"tariff_description\": \"от 200 руб/мес за 1 объект\",// Описание тарифа\n    \"contact_person\": \"Иванов Иван Иванович\",//Контактное лицо\n    \"email\": \"vegeho71508@epeva.com\",//Email\n    \"phone\": \"7898423456334\",//Телефон\n    \"system\": { //Система оплаты, key=MODULBANK для модульбанка, key=PAYBOX для paybox\n        \"key\": \"MODULBANK\",\n        \"type\": \"payment_types\",\n        \"value\": \"Модульбанк\"\n    },\n    \"public_offer_link\": \"https://api.skif.pro/api_v1//files/dealer_offer/1397418377_526c18df-d7d2-4de5-b50a-263515a374e2.pdf\" // Ссылка для загрузки оферту\n}\n\n ```",
        "operationId": "dealerInn",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "x-rate-limit": "60 req/min",
        "x-min-role": "Supervisor",
        "parameters": [
          {
            "name": "inn",
            "in": "path",
            "required": true,
            "description": "ИНН интегратора или дилера",
            "schema": {
              "type": "string",
              "format": "string"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "inn",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/dealers/{id}": {
      "put": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers/:id",
        "description": "**Обновить данные дилера**\n\n---\n\n**Роль:** Редактор тарифа и выше.\n\n---\n\n**Параметры:**\n\n```\n{\n    \"id\": \"8ce34b65-49da-4bac-bbce-379da83e9638\", //ID дилера\n    \"type\": {  // Тип организации\n        \"key\": \"legal_entity\",\n        \"type\": \"dealer_types\",\n        \"value\": \"Юридическое лицо\"\n    },\n    \"inn\": \"7701234567\", //ИНН\n    \"phone\": \"+7899323236\", // Номер телефона\n    \"email\": \"email@skif.com\", // Email\n    \"contact_person\": \"Ivanov Ivan\", //Контактное лицо\n    \"name\": \"СКИФ ЭПП\",//Название компании\n    \"server\": \"212.158.160.177\",//Сервер для отправки данных терминала\n    \"sms_tariff\": 1000, //SMS тариф\n    \"address\": \"Лининский проспект, 116к1, Москва, 119415\",//Адрес\n    \"services\": \"Мониторинг транспорта\", // Услуги\n    \"tariff_description\": \"от 200 руб/мес за 1 объект\", //Описание тарифа\n    \"billing\": { //Биллинг\n        \"system\": \"MODULBANK\", //Платежная система, обязательное, получается из справочника type = payment_types\n        \"merchant\": \"111222333\",// Идентификатор магазина, обязательное\n        \"key\": \"key123xyz\",//Секретный ключ, обязательное\n        \"default_unit_price\": 260, Стоимость одного объекта по умолчанию, обязательное\n        \"default_trial_length_days\": 10, Пробный период (дней) по умолчанию, обязательное\n        \"default_period_length_days\": 30, Период оплаты (дней)  по умолчанию, обязательное\n        \"qr_unit_price\": 270, Стоимость одного объекта  по qr, необязательное\n        \"qr_trial_length_days\": 20,Пробный период (дней) по qr, необязательное\n        \"qr_period_length_days\": 40, Период оплаты (дней)  по qr, необязательное\n        \"public_offer_path\": \"/files/dealer_offer/1933792985_8ce34b65-49da-4bac-bbce-379da83e9638.pdf\" //Публичная оферта (Прикрепленный файл и подсказка - это соглашение об использовании мобильного приложения будет отображаться вашим пользователям), необязательное\n    },\n    \"is_default\": false,\n    \"telegram_bot_token\": \"6734990111:RTF6Tik\"\n}\n\n ```\n\nсм метод POST /dealers\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из возврата метода GET /dealers?ids=:id",
        "operationId": "dealersId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "_default": {
                    "type": "boolean",
                    "example": false
                  },
                  "_delete": {
                    "type": "boolean",
                    "example": false
                  },
                  "contact_person": {
                    "type": "string",
                    "example": "XXXXXXX"
                  },
                  "email": {
                    "type": "string",
                    "example": "ewqew123@mail.com"
                  },
                  "id": {
                    "type": "string",
                    "example": "dd11e469-f929-4087-96b2-3911335015c1"
                  },
                  "inn": {
                    "type": "string",
                    "example": "34324324324"
                  },
                  "is_default": {
                    "type": "boolean",
                    "example": false
                  },
                  "name": {
                    "type": "string",
                    "example": "Мониторинг Плюс Москва"
                  },
                  "phone": {
                    "type": "string",
                    "example": "+7787878"
                  },
                  "server": {
                    "type": "string",
                    "example": "178.90.136.62"
                  },
                  "sms_tokens": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "dy1U71vtQCmhd3ssQCdlAg:APA91bEXYJWhD9cyEn4ey8x_1gEetf3-SRBVD6w_F9NIariIeYZhMV8fSC38RlkX4tiVmTTZ8Q1L-SpOjPf97L0u-FMHCseA0AhNnCYavVoFcSApJ-4dSOBi66EG74I4Gi4G3RGwWYOk"
                    },
                    "example": [
                      "dy1U71vtQCmhd3ssQCdlAg:APA91bEXYJWhD9cyEn4ey8x_1gEetf3-SRBVD6w_F9NIariIeYZhMV8fSC38RlkX4tiVmTTZ8Q1L-SpOjPf97L0u-FMHCseA0AhNnCYavVoFcSApJ-4dSOBi66EG74I4Gi4G3RGwWYOk"
                    ]
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "legal_entity"
                      },
                      "type": {
                        "type": "string",
                        "example": "dealer_types"
                      },
                      "value": {
                        "type": "string",
                        "example": "Юридическое лицо"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/dealers/:id": {
                  "value": {
                    "_default": false,
                    "_delete": false,
                    "contact_person": "XXXXXXX",
                    "email": "ewqew123@mail.com",
                    "id": "dd11e469-f929-4087-96b2-3911335015c1",
                    "inn": "34324324324",
                    "is_default": false,
                    "name": "Мониторинг Плюс Москва",
                    "phone": "+7787878",
                    "server": "178.90.136.62",
                    "sms_tokens": [
                      "dy1U71vtQCmhd3ssQCdlAg:APA91bEXYJWhD9cyEn4ey8x_1gEetf3-SRBVD6w_F9NIariIeYZhMV8fSC38RlkX4tiVmTTZ8Q1L-SpOjPf97L0u-FMHCseA0AhNnCYavVoFcSApJ-4dSOBi66EG74I4Gi4G3RGwWYOk"
                    ],
                    "type": {
                      "key": "legal_entity",
                      "type": "dealer_types",
                      "value": "Юридическое лицо"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID дилера/интегратора",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers/:id",
        "description": "**Удаление дилера по его id**\n\n---\n\nУдаляет дилера\n\n---\n\n**Параметры:**\n\nid записи\n\n---\n\n**Ответ:** 200\n\nЕсли дилер с таким id не найден возвращается ошибка 422.\n\n```\n{\n    \"code\": 422,\n    \"field\": \"id\",\n    \"message\": \"Параметр не найден в базе\"\n}\n\n ```",
        "operationId": "dealersId1",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID дилера/интегратора",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID интегратора"
        }
      ]
    },
    "/api_v1/dealers/{id}/block_unblock": {
      "post": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers/:id/block_unblock",
        "description": "**Блокировка / разблокировка интегратора**\n\n---\n\nБлокирует / разблокирует интегратора.\n\n---\n\n**Параметры:**\n\nid - ID интегратора\n\nВ теле запроса отправить \"block\": true для блокировки, \"block\": false для разблокировки\n\n---\n\n``` json\n{\n    \"block\": true\n}\n\n ```",
        "operationId": "dealersIdBlockUnblock",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "block": {
                    "type": "boolean",
                    "example": true
                  }
                }
              },
              "examples": {
                "/dealers/:id/block_unblock": {
                  "value": {
                    "block": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID дилера для блокировки/разблокировки",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID интегратора"
        }
      ]
    },
    "/api_v1/dealers_admin_query": {
      "post": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers_admin_query",
        "description": "**Поиск интеграторов в админке**\n\n---\n\nПоиск выполняется по полей name, email, phone\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nНайти по названию \"Новый Скиф\"\n\n```\n{\n   \"value\": \"Новый Скиф\",\n   \"from\": 0,\n   \"count\": 100\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"2cbd9d97-329d-4631-9161-b11556561b77\",\n            \"is_default\": false,\n            \"name\": \"ООО \"ТехноЛогистика\",\n            \"inn\": \"7701234567\",\n            \"phone\": \"+79990000001\",\n            \"email\": \"support@example.com\",\n            \"contact_person\": \"Иванов Иван Иванович\",\n            \"regions\": [],\n            \"_default\": false\n        },\n        {\n            \"id\": \"8ce34b65-49da-4bac-bbce-379da83e9638\",\n            \"is_default\": false,\n            \"name\": \"ООО \\\"Новый Скиф2\\\"\",\n            \"inn\": \"7701234567\",\n            \"phone\": \"+79990000001\",\n            \"email\": \"support@example.com\",\n            \"contact_person\": \"Иванов Иван Иванович\",\n            \"regions\": [\n                \"Узбекистан\",\n                \"Туркменистан\"\n            ],\n            \"_default\": false\n        }\n    ]\n}\n\n ```",
        "operationId": "dealersAdminQuery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "count": {
                    "type": "number",
                    "example": 100
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "value": {
                    "type": "string",
                    "example": "Новая Скиф"
                  }
                }
              },
              "examples": {
                "/dealers_admin_query": {
                  "value": {
                    "count": 100,
                    "from": 0,
                    "value": "Новая Скиф"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "parameters": []
      }
    },
    "/api_v1/dealers/send_email/static": {
      "post": {
        "tags": [
          "Интеграторы"
        ],
        "summary": "/dealers/send_email/static",
        "description": "dealer_key:\n\nlegal_entity\n\nindividual_entrepreneur",
        "operationId": "dealersSendEmailStatic",
        "parameters": [
          {
            "name": "cookie",
            "in": "header",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "captcha": {
                    "type": "string",
                    "example": "p54xa"
                  },
                  "company_name": {
                    "type": "string",
                    "example": "company_name"
                  },
                  "dealer_key": {
                    "type": "string",
                    "example": "legal_entity"
                  },
                  "inn": {
                    "type": "string",
                    "example": "456984332"
                  },
                  "phone": {
                    "type": "string",
                    "example": "+7999999999"
                  },
                  "user_email": {
                    "type": "string",
                    "example": "user_email"
                  },
                  "username": {
                    "type": "string",
                    "example": "username"
                  }
                }
              },
              "examples": {
                "/dealers/send_email/static": {
                  "value": {
                    "captcha": "p54xa",
                    "company_name": "company_name",
                    "dealer_key": "legal_entity",
                    "inn": "456984332",
                    "phone": "+7999999999",
                    "user_email": "user_email",
                    "username": "username"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor"
      }
    },
    "/api_v1/boxes/create_code": {
      "post": {
        "tags": [
          "Коробочное решение"
        ],
        "summary": "Генерация партии активационных кодов",
        "description": "**Создание нового кода для коробочного решения**\n\n---\n\n**Параметры:**\n\nunits: список объектов (пока обрабатывается только один объект)\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"units\": [\n        {\"id\": \"c031563b-31df-43ab-b60d-7c79cd4ae500\"}\n    ]\n}\n\n ```\n\n---\n\nПример ответа:\n\nВозвращается созданная запись\n\n```\n{\n    \"id\": \"e5020ef9-1d9f-4e80-a189-d54b5a6535a8\",\n    \"dealer_id\": \"b0de9e77-3ae1-4a1d-b246-6ba1bccf0052\",\n    \"unit_id\": \"c031563b-31df-43ab-b60d-7c79cd4ae500\",\n    \"code\": \"A6P29V\",\n    \"link\": \"https://app.skif.page.link/?link=https://dev.skif.pro/boxes?code=A6P29V&apn=ru.skifapp.skif&amv=27&afl=https://dev.skif.pro/c\",\n    \"used\": false\n}\n\n ```\n\nИмеет значение code - Шестизначный код и link - cсылка для QR кода.  \nЕсли уже был создан код для данного объекта тогда возвращается созданная запись.",
        "operationId": "boxesCreateCode",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "c031563b-31df-43ab-b60d-7c79cd4ae500"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "c031563b-31df-43ab-b60d-7c79cd4ae500"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/boxes/create_code": {
                  "value": {
                    "units": [
                      {
                        "id": "c031563b-31df-43ab-b60d-7c79cd4ae500"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "parameters": []
      }
    },
    "/api_v1/boxes/create_unit": {
      "post": {
        "tags": [
          "Коробочное решение"
        ],
        "summary": "Активация коробки и привязка объекта к компании",
        "description": "**Создание объекта по коду из коробочного решения**\n\n---\n\n**Параметры:**\n\n1) Если выбран \"Я новый пользователь SKIF.PRO\" то выполняется регистрация, при этом указать new_user=true и данные для регистрация.\n\nПример запроса:\n\n```\n{\n    \"new_user\": true,\n    \"code\": \"A6P29V\", // код\n    \"userProviderId\": \"demo_user@skif.pro\", // email\n    \"type\": \"EMAIL\",\n    \"company_name\": \"Company123\", // название компании\n    \"name\": \"Саша\", // Имя пользователя\n    \"phone\": \"+7(894)455-32-43\", // телефон\n    \"password\": \"12345abc\", //пароль\n    \"timezone\": {\n        \"key\": \"UTC+3\"// получить список от GET /properties type=timezones\n    }, // таймзона компании\n    \"unit_name\": \"Bersendz benz Bus 455\", // Имя объекта\n    \"unit_type\": {\"key\": \"bus\"} // Тип объекта, получить список от GET /properties type=unit_type\n}\n\n ```\n\n---\n\nСоздается новая компания, пользователь с указанном email, паролем и объектом. Возвращает новую сессию со статусом OK, если всё ok, иначе ошибка со статусом 422.\n\n2) Если выбран \"У меня есть учетная запись SKIF.PRO\" тогда указать код, компанию и данные объекта\n\n```\n{\n    \"new_user\": false,\n    \"code\": \"ARKMV1\",\n    \"company\": {\n        \"id\": \"9b18ce93-c4eb-4479-a978-36c640c54f31\"\n    },\n    \"unit_name\": \"Bersendz benz Bus 455\",\n    \"unit_type\": {\"key\": \"bus\"}\n}\n\n ```\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "boxesCreateUnit",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "example": "SYSM1I"
                  },
                  "company": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "43e5a836-8070-4151-9e77-a5954d4d8b5d"
                      }
                    }
                  },
                  "new_user": {
                    "type": "boolean",
                    "example": false
                  },
                  "unit_name": {
                    "type": "string",
                    "example": "Bersendz benz Bus 111"
                  },
                  "unit_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "car"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/boxes/create_unit": {
                  "value": {
                    "code": "SYSM1I",
                    "company": {
                      "id": "43e5a836-8070-4151-9e77-a5954d4d8b5d"
                    },
                    "new_user": false,
                    "unit_name": "Bersendz benz Bus 111",
                    "unit_type": {
                      "key": "car"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "parameters": []
      }
    },
    "/api_v1/boxes/{id}": {
      "put": {
        "tags": [
          "Коробочное решение"
        ],
        "summary": "Обновление статуса или параметров коробки",
        "description": "**Обновление данных кода по ID**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Параметры:**  \nmessage - информационный текст\n\n```\n{\n  \"message\": \"some message\"\n}\n\n ```\n\n---\n\nВозвращает обновленную запись",
        "operationId": "boxesId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "message": {
                    "type": "string",
                    "example": "abcXYZ"
                  }
                }
              },
              "examples": {
                "/boxes/:id": {
                  "value": {
                    "message": "abcXYZ"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID коробки",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          }
        }
      ]
    },
    "/api_v1/boxes": {
      "get": {
        "tags": [
          "Коробочное решение"
        ],
        "summary": "Проверка кода активации коробочного решения",
        "description": "**Получение информации о коде**\n\n---\n\n**Параметры:**  \ncode - шестизначный код в коробке\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Ответ:**  \nused - true если уже использовался\n\n```\n{\n    \"id\": \"483f0de0-b8d1-4822-b672-d7d35c659373\",\n    \"dealer_id\": \"dd11e469-f929-4087-96b2-3911335015c1\",\n    \"unit_id\": \"4bb05676-1d99-4552-a037-1288c3e60b83\",\n    \"code\": \"AT1FPU\",\n    \"link\": \"https://appskif.page.link/?link=https://dev.skif.pro/c?code=AT1FPU&apn=ru.skifapp.skif&amv=27&ibi=com.skifApp.SKIF2&isi=1540602214&imv=1.4.6&efr=1\",\n    \"used\": true\n}\n\n ```",
        "operationId": "boxesCodeCode",
        "parameters": [
          {
            "name": "code",
            "in": "query",
            "required": true,
            "description": "Активационный код коробки",
            "schema": {
              "type": "string",
              "example": "SYSM1I"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/emulators/start": {
      "get": {
        "tags": [
          "Эмулятор трека"
        ],
        "summary": "Запуск генерации эмуляции трека",
        "description": "**Начать эмуляцию**\n\n---\n\n**Параметры:**\n\nterminal_type - ключ типа терминала, протокол реального и фейкого объекта должен быть таким же.\n\nimei - реальный imei, с которого нужно начинать эмуляцию.  \nfake_imei - imei созданного объекта для теста.  \ndate_from - Дата и время начала, в формате yyy-MM-dd HH:mm:ss в UTC  \ndate_to - Дата и время окончания, в формате yyy-MM-dd HH:mm:ss в UTC\n\n---\n\n**Пример запроса:**  \nGET [https://dev.skif.pro/api_v1/emulators/start?imei=862531040000003&amp;fake_imei=33344455566777&amp;from=2021-11-11](https://dev.skif.pro/api_v1/emulators/start?imei=862531040000003&fake_imei=33344455566777&from=2021-11-11) 10:10:00&to=2021-11-11 10:15:00",
        "operationId": "emulatorsStart",
        "parameters": [
          {
            "name": "terminal_type",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "egts"
            }
          },
          {
            "name": "imei",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "862531040000004"
            }
          },
          {
            "name": "fake_imei",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "33344455566777"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "2023-09-30 21:00:00"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "2023-10-00 16:41:55"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-internal": true,
        "x-min-role": "superadmin",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/emulators/stop": {
      "get": {
        "tags": [
          "Эмулятор трека"
        ],
        "summary": "Остановка генерации эмуляции трека",
        "description": "**Остановить эмуляцию**\n\n---\n\nНапример:  \nGET [https://dev.skif.pro/api_v1/emulators/stop?fake_imei=33344455566777](https://dev.skif.pro/api_v1/emulators/stop?fake_imei=33344455566777)",
        "operationId": "emulatorsStop",
        "parameters": [
          {
            "name": "fake_imei",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "33344455566777"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-internal": true,
        "x-min-role": "superadmin",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/emulators/show": {
      "get": {
        "tags": [
          "Эмулятор трека"
        ],
        "summary": "Просмотр статуса активных эмуляторов треков",
        "description": "**Получение списка фейковых imei для которых запущен эмулятор**",
        "operationId": "emulatorsShow",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-internal": true,
        "x-min-role": "superadmin",
        "x-rate-limit": "10 req/min",
        "parameters": []
      }
    },
    "/api_v1/efis/units": {
      "get": {
        "tags": [
          "Интеграция с ЕФИС"
        ],
        "summary": "Получение списка объектов мониторинга для ЕФИС ЗСН",
        "description": "Возвращает перечень техники компании, зарегистрированной для интеграции с Минсельхоз РФ (ЕФИС ЗСН).",
        "operationId": "efisUnits",
        "responses": {
          "200": {
            "description": "Список объектов для интеграции с ЕФИС",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
                      },
                      "name": {
                        "type": "string",
                        "example": "Трактор К-744Р (Т101ТТ)"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/efis/units/{id}/messages/{time_from}/{time_to}": {
      "get": {
        "tags": [
          "Интеграция с ЕФИС"
        ],
        "summary": "Получение телематических сообщений конкретного объекта для ЕФИС ЗСН",
        "description": "Экспорт телеметрии по заданному объекту за интервал времени в стандарте ЕФИС ЗСН.",
        "operationId": "efisUnitsIdMessagesTimeFromTimeToIndexFromUintIndexToUint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID объекта мониторинга",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          },
          {
            "name": "time_from",
            "in": "path",
            "required": true,
            "description": "Начало интервала (Unix timestamp в секундах)",
            "schema": {
              "type": "integer",
              "example": 1704067200
            }
          },
          {
            "name": "time_to",
            "in": "path",
            "required": true,
            "description": "Окончание интервала (Unix timestamp в секундах)",
            "schema": {
              "type": "integer",
              "example": 1704153600
            }
          },
          {
            "name": "index_from",
            "in": "query",
            "required": false,
            "description": "Индекс первого сообщения",
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "name": "index_to",
            "in": "query",
            "required": false,
            "description": "Индекс последнего сообщения (до 1000 сообщений)",
            "schema": {
              "type": "integer",
              "default": 1000
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min"
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID объекта"
        },
        {
          "name": "time_from",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "Начало интервала (время UTC, Unix  timestamp в секундах"
        },
        {
          "name": "time_to",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "Окончание интервала (время UTC, Unix  timestamp в секундах)"
        }
      ]
    },
    "/api_v1/efis/units/messages/{time_from}/{time_to}": {
      "get": {
        "tags": [
          "Интеграция с ЕФИС"
        ],
        "summary": "Получение телематических сообщений всех объектов для ЕФИС ЗСН",
        "description": "Экспорт телеметрии по всем зарегистрированным машинам за интервал времени в стандарте протокола ЕФИС ЗСН.",
        "operationId": "efisUnitsMessagesTimeFromTimeToIndexFromUintIndexToUint",
        "parameters": [
          {
            "name": "time_from",
            "in": "path",
            "required": true,
            "description": "Начало интервала выборки (время UTC, Unix timestamp в секундах)",
            "schema": {
              "type": "integer",
              "example": 1704067200
            }
          },
          {
            "name": "time_to",
            "in": "path",
            "required": true,
            "description": "Окончание интервала выборки (время UTC, Unix timestamp в секундах)",
            "schema": {
              "type": "integer",
              "example": 1704153600
            }
          },
          {
            "name": "index_from",
            "in": "query",
            "required": false,
            "description": "Индекс первого сообщения (начиная с 0)",
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "name": "index_to",
            "in": "query",
            "required": false,
            "description": "Индекс последнего сообщения (не включительно, лимит не более 1000 сообщений за запрос)",
            "schema": {
              "type": "integer",
              "default": 1000
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "30 req/min"
      },
      "parameters": [
        {
          "name": "time_from",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "Начало интервала (время UTC, Unix  timestamp в секундах)"
        },
        {
          "name": "time_to",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "Окончание интервала (время UTC, Unix  timestamp в секундах)"
        }
      ]
    },
    "/api_v1/feedback": {
      "get": {
        "tags": [
          "Отзывы"
        ],
        "summary": "/feedback?ids=ids",
        "description": "**Поиск отзыва по ID**\n\n---\n\nВозвращает массив отзывов по ID.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретный отзыв.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\nGET /feedback?ids=78516162-cf8a-4056-bdaa-73ca6311a1d5\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"78516162-cf8a-4056-bdaa-73ca6311a1d5\",\n    \"company\": {\n        \"id\": \"1792239f-47eb-42b3-aef7-c49a3cc6988e\",\n        \"name\": \"Мониторинг Плюс Москва\"\n    },\n    \"user\": {\n        \"id\": \"6e8f4833-c430-4509-ac5e-e1802691655c\",\n        \"name\": \"azat\",\n        \"email\": \"support@example.com\"\n    },\n    \"type\": {\n        \"key\": \"proposal\",\n        \"type\": \"feedback_type\",\n        \"value\": \"Предложение\"\n    },\n    \"rating\": 5,\n    \"message\": \"Все супер!!!\"\n}\n\n ```",
        "operationId": "feedbackIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader"
      },
      "post": {
        "tags": [
          "Отзывы"
        ],
        "summary": "/feedback",
        "description": "**Создание нового отзыва**\n\n---\n\nПоля запроса JSON:  \nrating - число от 1 до 5, обязательное  \nmessage - текст отзыва, обязательное  \ntype - тип отзыва, выбрать из GET /properties где type=feedback_type, обязательное\n\nПример запроса:\n\n```\n{\n    \"rating\": 5,\n    \"type\": {\"key\": \"proposal\"},\n    \"message\": \"Все супер!!!\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"78516162-cf8a-4056-bdaa-73ca6311a1d5\",\n    \"company\": {\n        \"id\": \"1792239f-47eb-42b3-aef7-c49a3cc6988e\",\n        \"name\": \"Мониторинг Плюс Москва\"\n    },\n    \"user\": {\n        \"id\": \"6e8f4833-c430-4509-ac5e-e1802691655c\",\n        \"name\": \"azat\",\n        \"email\": \"support@example.com\"\n    },\n    \"type\": {\n        \"key\": \"proposal\",\n        \"type\": \"feedback_type\",\n        \"value\": \"Предложение\"\n    },\n    \"rating\": 5,\n    \"message\": \"Все супер!!!\"\n}\n\n ```",
        "operationId": "feedback",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "message": {
                    "type": "string",
                    "example": "Все супер!!!"
                  },
                  "rating": {
                    "type": "number",
                    "example": 5
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "proposal"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/feedback": {
                  "value": {
                    "message": "Все супер!!!",
                    "rating": 5,
                    "type": {
                      "key": "proposal"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/feedback/{id}": {
      "delete": {
        "tags": [
          "Отзывы"
        ],
        "summary": "/feedback/:id",
        "description": "**Удаление отзыва по ID**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса**\n\n```\nhttps://dev.skif.pro/api_v1/feedback/03d5be4f-4adb-4bd7-99b2-ab0edaaa414a\n\n ```",
        "operationId": "feedbackId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "message": {
                    "type": "string",
                    "example": "Все супер!!!"
                  },
                  "rating": {
                    "type": "number",
                    "example": 5
                  },
                  "type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "proposal"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/feedback/:id": {
                  "value": {
                    "message": "Все супер!!!",
                    "rating": 5,
                    "type": {
                      "key": "proposal"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID отзыва",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID отзыва"
        }
      ]
    },
    "/api_v1/feedback_admin_query": {
      "post": {
        "tags": [
          "Отзывы"
        ],
        "summary": "/feedback_admin_query",
        "description": "Быстрый поиск отзывов в админ панеле\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"value\": 5\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"max\": 1,\n    \"list\": [\n        {\n            \"id\": \"78516162-cf8a-4056-bdaa-73ca6311a1d5\",\n            \"company\": {\n                \"id\": \"1792239f-47eb-42b3-aef7-c49a3cc6988e\",\n                \"name\": \"Мониторинг Плюс Москва\"\n            },\n            \"user\": {\n                \"id\": \"6e8f4833-c430-4509-ac5e-e1802691655c\",\n                \"name\": \"azat\",\n                \"email\": \"support@example.com\"\n            },\n            \"type\": {\n                \"key\": \"proposal\",\n                \"type\": \"feedback_type\",\n                \"value\": \"Предложение\"\n            },\n            \"rating\": 5,\n            \"message\": \"Все супер!!!\"\n        }\n    ]\n}\n\n ```",
        "operationId": "feedbackAdminQuery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "count": {
                    "type": "number",
                    "example": 10
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "value": {
                    "type": "number",
                    "example": 5
                  }
                }
              },
              "examples": {
                "/feedback_admin_query": {
                  "value": {
                    "count": 10,
                    "from": 0,
                    "value": 5
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/feedback/list": {
      "post": {
        "tags": [
          "Отзывы"
        ],
        "summary": "/feedback/list",
        "description": "**Поиск отзывов**\n\n---\n\nfrom - начальный индекс.  \ncount - количество записей.  \nconditions - условия.  \nfield - название поля, возможные значения: rating, type.key.  \nvalue - значение.\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"conditions\": [\n        {\"field\": \"rating\", \"value\": \"5\"}\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"max\": 1,\n    \"list\": [\n        {\n            \"id\": \"78516162-cf8a-4056-bdaa-73ca6311a1d5\",\n            \"company\": {\n                \"id\": \"1792239f-47eb-42b3-aef7-c49a3cc6988e\",\n                \"name\": \"Мониторинг Плюс Москва\"\n            },\n            \"user\": {\n                \"id\": \"6e8f4833-c430-4509-ac5e-e1802691655c\",\n                \"name\": \"azat\",\n                \"email\": \"support@example.com\"\n            },\n            \"type\": {\n                \"key\": \"proposal\",\n                \"type\": \"feedback_type\",\n                \"value\": \"Предложение\"\n            },\n            \"rating\": 5,\n            \"message\": \"Все супер!!!\"\n        }\n    ]\n}\n\n ```",
        "operationId": "feedbackList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "type.key"
                        },
                        "value": {
                          "type": "string",
                          "example": "proposal"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "type.key",
                        "value": "proposal"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 2
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  }
                }
              },
              "examples": {
                "/feedback/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "type.key",
                        "value": "proposal"
                      }
                    ],
                    "count": 2,
                    "from": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/locators": {
      "get": {
        "tags": [
          "Ссылки доступа (Локатор)"
        ],
        "summary": "/locators?ids=ids",
        "description": "**Поиск локаторов по ID**\n\n---\n\nВозвращает массив локаторов по ID.\n\nЕсли в параметре ids содержится только один id, то вернется НЕ массив из 1 элемента, а конкретный локатор.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\nGET /locators?ids=5bf87787-9592-41c7-a25e-500cc1234402\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"5bf87787-9592-41c7-a25e-500cc1234402\",\n    \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n    \"units\": [{\n        \"id\": \"1f6fe207-31c9-4cd0-894b-7b1cb85944c9\",\n        \"name\": \"Маршрутка\",\n        \"imei\": \"338770698941441\",\n        \"icon\": {\n            \"key\": \"van_universal2_red\",\n            \"type\": \"unit_icon\",\n            \"value\": \"Иконка\"\n        }\n    },{\n        \"id\": \"3dee5ff9-808f-4536-bec3-9e146bca9327\",\n        \"name\": \"Бензовоз\",\n        \"imei\": \"514295160184391\",\n        \"icon\": {\n            \"key\": \"van_universal2_red\",\n            \"type\": \"unit_icon\",\n            \"value\": \"Иконка\"\n        }\n    }\n    ],\n    \"date_from\": \"2022-10-28 00:00:00\",\n    \"date_to\": \"2022-10-29 00:00:00\",\n    \"status\": {\n        \"key\": \"locator_finished\",\n        \"type\": \"locator_type\",\n        \"value\": \"Завершено\"\n    },\n    \"is_active\": true,\n    \"description\": \"Сопроводительное письмо\",\n    \"_active\": true\n}\n\n ```",
        "operationId": "locatorsIdsIds",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Operator"
      },
      "post": {
        "tags": [
          "Ссылки доступа (Локатор)"
        ],
        "summary": "/locators",
        "description": "**Cоздание ссылки для объекта, по которой пользователь без доступа к SKIF.PRO может следить за объектом на карте**\n\n---\n\nСсылка на объект формируется следующим образом: {{base_url}}/locator?id=:locator_id\n\n---\n\nПоля запроса JSON:\n\nname - Название  \nunits - объекты или units_groups - группы объектов  \ndate_from - время начала  \ndate_to - время окончания  \ndescription - Сопроводительное письмо\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\nПример запроса:\n\n```\n{\n    \"name\": \"Имя\",\n    \"units\": [\n        {\"id\": \"1f6fe207-31c9-4cd0-894b-7b1cb85944c9\"},\n        {\"id\": \"3fb49648-49d9-4ab7-9ec9-1577dc6164d4\"}\n    ],\n    \"date_from\": \"2022-09-27 00:00:00\",\n    \"date_to\": \"2022-09-28 00:00:00\",\n    \"description\": \"Some text\"\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nstatus - определяется автоматически: запланировано, запущено или завершено  \nactive - true, если отключено\n\n```\n{\n    \"id\": \"7b58f5a0-947d-446f-ad77-3cfd4a68a956\",\n    \"name\": \"Имя\",\n    \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n    \"units\": [{\n        \"id\": \"1f6fe207-31c9-4cd0-894b-7b1cb85944c9\",\n        \"name\": \"Маршрутка\"\n    },{\n        \"id\": \"3fb49648-49d9-4ab7-9ec9-1577dc6164d4\",\n        \"name\": \"Бензовоз\"\n     }\n    ],\n    \"date_from\": \"2022-09-27 00:00:00\",\n    \"date_to\": \"2022-09-28 00:00:00\",\n    \"description\": \"Some text\",\n    \"status\": {\n        \"key\": \"locator_running\",\n        \"type\": \"locator_type\",\n        \"value\": \"Запущено\"\n    },\n    \"is_active\": true\n}\n\n ```\n\n**Для группы объектов:**\n\n```\n{\n    \"name\": \"Имя\",\n    \"units_groups\": [{\n        \"id\": \"a707cc43-c585-4022-8584-f1b0881e7d71\"\n    },{\n        \"id\": \"3dee5ff9-808f-4536-bec3-9e146bca9327\"\n     }\n    ],\n    \"date_from\": \"2025-01-08 00:00:00\",\n    \"date_to\": \"2025-10-29 00:00:00\",\n    \"description\": \"Сопроводительное письмо\"\n}\n\n ```",
        "operationId": "locators",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_from": {
                    "type": "string",
                    "example": "2025-01-08 00:00:00"
                  },
                  "date_to": {
                    "type": "string",
                    "example": "2025-10-29 00:00:00"
                  },
                  "description": {
                    "type": "string",
                    "example": "Сопроводительное письмо"
                  },
                  "units_group": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "a707cc43-c585-4022-8584-f1b0881e7d71"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/locators": {
                  "value": {
                    "date_from": "2022-10-28 00:00:00",
                    "date_to": "2022-10-29 00:00:00",
                    "description": "Сопроводительное письмо",
                    "name": "Имя",
                    "units": [
                      {
                        "id": "1f6fe207-31c9-4cd0-894b-7b1cb85944c9"
                      }
                    ]
                  }
                },
                "/locators For Group": {
                  "value": {
                    "date_from": "2025-01-08 00:00:00",
                    "date_to": "2025-10-29 00:00:00",
                    "description": "Сопроводительное письмо",
                    "units_group": {
                      "id": "a707cc43-c585-4022-8584-f1b0881e7d71"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/locator": {
      "get": {
        "tags": [
          "Ссылки доступа (Локатор)"
        ],
        "summary": "/locator?id=:id",
        "description": "**Получение информации о локаторе по ID**\n\n---\n\n**Пример запроса:**\n\nGET /locator?id=ee07b417-a85f-4fc5-a37a-416f98295ab7\n\n---\n\n**Пример ответа:**\n\nВозвращаются следующие поля:\n\n- unit - информация об объекта: id, name, icon.\n- icon - ключ иконки объекта.\n- is_active - активность.\n- description - описание.\n- date_from - дата и время начала.\n\n\n``` json\n{\n    \"id\": \"ee07b417-a85f-4fc5-a37a-416f98295ab7\",\n    \"is_active\": true,\n    \"description\": \"ывфв\",\n    \"date_from\": \"2025-01-03 00:00:00\",\n    \"date_to\": \"2025-01-31 00:00:00\",\n    \"unit\": {\n        \"id\": \"4c99d470-d356-43d9-a35b-f30e72c501c0\",\n        \"name\": \"Дрон Леталка\",\n        \"icon\": \"quadrocopter_blue\"\n    }\n}\n\n ```\n\nВозвращает запись локатора, если он найден, иначе ошибка с кодом 422:\n\n```\n{\n\"code\": 4220,\n\"message\": \"Неверная ссылка доступа\"\n}\n\n ```\n\n---\n\n**Для группы объектов:**\n\nВместо unit приходит units_group. В нем units - информация об объектах.\n\n``` json\n{\n    \"id\": \"11647617-3d50-42f5-94a7-e2f199e4cc4c\",\n    \"is_active\": true,\n    \"description\": \"Сопроводительное письмо\",\n    \"date_from\": \"2025-01-08 00:00:00\",\n    \"date_to\": \"2025-10-29 00:00:00\",\n    \"units_group\": {\n        \"id\": \"a707cc43-c585-4022-8584-f1b0881e7d71\",\n        \"name\": \"Шлишуе\",\n        \"units\": [\n            {\n                \"id\": \"2b7dee48-7804-4544-b0f0-e7f98ccffa24\",\n                \"name\": \"Galileo2\",\n                \"icon\": \"car_red\"\n            },\n            {\n                \"id\": \"4c99d470-d356-43d9-a35b-f30e72c501c0\",\n                \"name\": \"Дрон Леталка\",\n                \"icon\": \"quadrocopter_blue\"\n            },\n            {\n                \"id\": \"abe8c77e-4cbd-4d66-b1fe-723610cdfa32\",\n                \"name\": \"Galileo Test\",\n                \"icon\": \"autocrane_red\"\n            },\n            {\n                \"id\": \"c6286fe0-a597-43d0-b60f-2058bafbb9e0\",\n                \"name\": \"Курьер пиццерии\",\n                \"icon\": \"car_red\"\n            },\n            {\n                \"id\": \"c9f37a6a-56ff-450d-9e5b-16539f643e27\",\n                \"name\": \"Galileo1\",\n                \"icon\": \"car_red\"\n            }\n        ]\n    }\n}\n\n ```",
        "operationId": "locatorIdId",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "x-rate-limit": "60 req/min",
        "x-min-role": "Public"
      }
    },
    "/api_v1/locators/{id}": {
      "put": {
        "tags": [
          "Ссылки доступа (Локатор)"
        ],
        "summary": "/locators/:id",
        "description": "**Обновление данных локатора**\n\n---\n\n**Параметры:**\n\nсм метод POST /locators\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Ответ:**\n\nАналогичен одному объекту из ответа метода GET /locators?ids=:id",
        "operationId": "locatorsId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "_active": {
                    "type": "boolean",
                    "example": true
                  },
                  "company_id": {
                    "type": "string",
                    "example": "3aafd100-c44d-4b04-ae93-06978b908ea9"
                  },
                  "date_from": {
                    "type": "string",
                    "example": "2022-09-27 00:00:00"
                  },
                  "date_to": {
                    "type": "string",
                    "example": "2022-09-29 00:00:00"
                  },
                  "id": {
                    "type": "string",
                    "example": "7b58f5a0-947d-446f-ad77-3cfd4a68a956"
                  },
                  "is_active": {
                    "type": "boolean",
                    "example": true
                  },
                  "status": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "locator_running"
                      },
                      "type": {
                        "type": "string",
                        "example": "locator_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Запушено"
                      }
                    }
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "1f6fe207-31c9-4cd0-894b-7b1cb85944c9"
                        },
                        "name": {
                          "type": "string",
                          "example": "Маршрутка"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "1f6fe207-31c9-4cd0-894b-7b1cb85944c9",
                        "name": "Маршрутка"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/locators/:id": {
                  "value": {
                    "_active": true,
                    "company_id": "3aafd100-c44d-4b04-ae93-06978b908ea9",
                    "date_from": "2022-09-27 00:00:00",
                    "date_to": "2022-09-29 00:00:00",
                    "id": "7b58f5a0-947d-446f-ad77-3cfd4a68a956",
                    "is_active": true,
                    "status": {
                      "key": "locator_running",
                      "type": "locator_type",
                      "value": "Запушено"
                    },
                    "units": [
                      {
                        "id": "1f6fe207-31c9-4cd0-894b-7b1cb85944c9",
                        "name": "Маршрутка"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Operator",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID ссылки доступа (локатора)",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "Ссылки доступа (Локатор)"
        ],
        "summary": "/locators/:id",
        "description": "**Удаление локатора по ID**\n\n---\n\n**Роль:** Администратор и выше.",
        "operationId": "locatorsId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "count": {
                    "type": "number",
                    "example": 10
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  },
                  "value": {
                    "type": "number",
                    "example": 5
                  }
                }
              },
              "examples": {
                "/locators/:id": {
                  "value": {
                    "count": 10,
                    "from": 0,
                    "value": 5
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Operator",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID ссылки доступа (локатора)",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID локатора"
        }
      ]
    },
    "/api_v1/locators/list": {
      "post": {
        "tags": [
          "Ссылки доступа (Локатор)"
        ],
        "summary": "/locators/list",
        "description": "**Поиск локаторов**\n\n---\n\nfrom - начальный индекс.  \ncount - количество записей.  \nconditions - условия  \nfield - название поля, возвожные значения: unit.id, date_from, date_to.  \nvalue - значение\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"from\": 0,\n    \"count\": 10,\n    \"conditions\": [\n        {\"field\": \"unit.id\", \"value\": \"1f6fe207-31c9-4cd0-894b-7b1cb85944c9\"}\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"max\": 2,\n    \"list\": [\n        {\n            \"id\": \"56e539a1-5709-49b2-a3a3-5bc0710e0098\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"unit\": {\n                \"id\": \"1f6fe207-31c9-4cd0-894b-7b1cb85944c9\"\n            },\n            \"date_from\": \"2022-09-27 00:00:00\",\n            \"date_to\": \"2022-09-28 00:00:00\",\n            \"is_active\": true,\n            \"_active\": true\n        },\n        {\n            \"id\": \"7b58f5a0-947d-446f-ad77-3cfd4a68a956\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"unit\": {\n                \"id\": \"1f6fe207-31c9-4cd0-894b-7b1cb85944c9\"\n            },\n            \"date_from\": \"2022-09-27 00:00:00\",\n            \"date_to\": \"2022-09-28 00:00:00\",\n            \"is_active\": true,\n            \"description\": \"Some text\",\n            \"_active\": true\n        }\n    ]\n}\n\n ```",
        "operationId": "locatorsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "unit.id"
                        },
                        "value": {
                          "type": "string",
                          "example": "1f6fe207-31c9-4cd0-894b-7b1cb85944c9"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "unit.id",
                        "value": "1f6fe207-31c9-4cd0-894b-7b1cb85944c9"
                      }
                    ]
                  },
                  "count": {
                    "type": "number",
                    "example": 10
                  },
                  "from": {
                    "type": "number",
                    "example": 0
                  }
                }
              },
              "examples": {
                "/locators/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "unit.id",
                        "value": "1f6fe207-31c9-4cd0-894b-7b1cb85944c9"
                      }
                    ],
                    "count": 10,
                    "from": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/loadwln/{company_id}/units/analyze_terminals": {
      "post": {
        "tags": [
          "Импорт из Wialon"
        ],
        "summary": "Анализ терминалов и протоколов из файлов Wialon",
        "description": "Предварительный анализ экспортированных из Wialon объектов для определения типов терминалов и портов подключения.",
        "operationId": "loadwlnCompanyIdUnitsAnalyzeTerminals",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "parameters": [
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID целевой компании",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "2f2c629a-9087-4925-8240-d6d6b90aafda"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "company_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/loadwln/{company_id}/units/analyze_params": {
      "post": {
        "tags": [
          "Импорт из Wialon"
        ],
        "summary": "Анализ параметров и датчиков объектов Wialon",
        "description": "Парсинг и сопоставление датчиков и тарировочных таблиц топлива перед импортом в систему SKIF.",
        "operationId": "loadwlnCompanyIdUnitsAnalyzeParams",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "example": "b0bdff74-6901-4366-a06a-c32dfde15e5b"
                  },
                  "terminals": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "Navtelecom Signal S-2551"
                        },
                        "value": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "navtelecom"
                            },
                            "type": {
                              "type": "string",
                              "example": "terminal_type"
                            },
                            "value": {
                              "type": "string",
                              "example": "Navtelecom"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "Navtelecom Signal S-2551",
                        "value": {
                          "key": "navtelecom",
                          "type": "terminal_type",
                          "value": "Navtelecom"
                        }
                      },
                      {
                        "key": "Teltonika FM1100",
                        "value": {
                          "key": "teltonica_fm1100",
                          "type": "terminal_type",
                          "value": "teltonica_fm1100"
                        }
                      },
                      {
                        "key": "Teltonika FM4200",
                        "value": {
                          "key": "teltonica_fm4200",
                          "type": "terminal_type",
                          "value": "teltonica_fm4200"
                        }
                      },
                      {
                        "key": "Navtelecom SMART",
                        "value": {
                          "key": "navtelecom",
                          "type": "terminal_type",
                          "value": "Navtelecom"
                        }
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/loadwln/:company_id/units/analyze_params": {
                  "value": {
                    "id": "b0bdff74-6901-4366-a06a-c32dfde15e5b",
                    "terminals": [
                      {
                        "key": "Navtelecom Signal S-2551",
                        "value": {
                          "key": "navtelecom",
                          "type": "terminal_type",
                          "value": "Navtelecom"
                        }
                      },
                      {
                        "key": "Teltonika FM1100",
                        "value": {
                          "key": "teltonica_fm1100",
                          "type": "terminal_type",
                          "value": "teltonica_fm1100"
                        }
                      },
                      {
                        "key": "Teltonika FM4200",
                        "value": {
                          "key": "teltonica_fm4200",
                          "type": "terminal_type",
                          "value": "teltonica_fm4200"
                        }
                      },
                      {
                        "key": "Navtelecom SMART",
                        "value": {
                          "key": "navtelecom",
                          "type": "terminal_type",
                          "value": "Navtelecom"
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "parameters": [
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID целевой компании",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "2f2c629a-9087-4925-8240-d6d6b90aafda"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "company_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/loadwln/{company_id}/units/create": {
      "post": {
        "tags": [
          "Импорт из Wialon"
        ],
        "summary": "Пакетное создание объектов мониторинга из данных Wialon",
        "description": "Создание ТС, терминалов и датчиков на основе разобранного пакета Wialon.",
        "operationId": "loadwlnCompanyIdUnitsCreate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "example": "b0bdff74-6901-4366-a06a-c32dfde15e5b"
                  },
                  "terminals_params": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "params": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "example": "engine_load"
                              },
                              "value": {
                                "type": "string",
                                "example": "can_eng_load"
                              }
                            }
                          },
                          "example": [
                            {
                              "key": "engine_load",
                              "value": "can_eng_load"
                            },
                            {
                              "key": "engine_coolant_temp",
                              "value": "dut_temp_485_3"
                            },
                            {
                              "key": "engine_rpm",
                              "value": "can_rpm"
                            },
                            {
                              "key": "in2",
                              "value": "in_2_st"
                            },
                            {
                              "key": "touch_key",
                              "value": "touch_mem_key"
                            },
                            {
                              "key": "in1",
                              "value": "in_1_st"
                            },
                            {
                              "key": "in4",
                              "value": "in_4_st"
                            },
                            {
                              "key": "in3",
                              "value": "in_3_st"
                            },
                            {
                              "key": "in5",
                              "value": "in_5_st"
                            },
                            {
                              "key": "can_fuel_volume",
                              "value": "can_fuel_rate"
                            },
                            {
                              "key": "can_engine_hours",
                              "value": "can_eng_hours"
                            },
                            {
                              "key": "can_fuel_consumpt",
                              "value": "can_fuel_level"
                            },
                            {
                              "key": "out1",
                              "value": "out_1_st"
                            },
                            {
                              "key": "accel_pedal_pos",
                              "value": "can_accel_pos"
                            }
                          ]
                        },
                        "terminal_type": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "example": "navtelecom"
                            },
                            "type": {
                              "type": "string",
                              "example": "terminal_type"
                            },
                            "value": {
                              "type": "string",
                              "example": "Navtelecom"
                            }
                          }
                        }
                      }
                    },
                    "example": [
                      {
                        "params": [
                          {
                            "key": "engine_load",
                            "value": "can_eng_load"
                          },
                          {
                            "key": "engine_coolant_temp",
                            "value": "dut_temp_485_3"
                          },
                          {
                            "key": "engine_rpm",
                            "value": "can_rpm"
                          },
                          {
                            "key": "in2",
                            "value": "in_2_st"
                          },
                          {
                            "key": "touch_key",
                            "value": "touch_mem_key"
                          },
                          {
                            "key": "in1",
                            "value": "in_1_st"
                          },
                          {
                            "key": "in4",
                            "value": "in_4_st"
                          },
                          {
                            "key": "in3",
                            "value": "in_3_st"
                          },
                          {
                            "key": "in5",
                            "value": "in_5_st"
                          },
                          {
                            "key": "can_fuel_volume",
                            "value": "can_fuel_rate"
                          },
                          {
                            "key": "can_engine_hours",
                            "value": "can_eng_hours"
                          },
                          {
                            "key": "can_fuel_consumpt",
                            "value": "can_fuel_level"
                          },
                          {
                            "key": "out1",
                            "value": "out_1_st"
                          },
                          {
                            "key": "accel_pedal_pos",
                            "value": "can_accel_pos"
                          }
                        ],
                        "terminal_type": {
                          "key": "navtelecom",
                          "type": "terminal_type",
                          "value": "Navtelecom"
                        }
                      },
                      {
                        "params": [
                          {
                            "key": "in1",
                            "value": "din1"
                          },
                          {
                            "key": "in3",
                            "value": "din3"
                          }
                        ],
                        "terminal_type": {
                          "key": "teltonica_fm4200",
                          "type": "terminal_type",
                          "value": "teltonica_fm4200"
                        }
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/loadwln/:company_id/units/create": {
                  "value": {
                    "id": "b0bdff74-6901-4366-a06a-c32dfde15e5b",
                    "terminals_params": [
                      {
                        "params": [
                          {
                            "key": "engine_load",
                            "value": "can_eng_load"
                          },
                          {
                            "key": "engine_coolant_temp",
                            "value": "dut_temp_485_3"
                          },
                          {
                            "key": "engine_rpm",
                            "value": "can_rpm"
                          },
                          {
                            "key": "in2",
                            "value": "in_2_st"
                          },
                          {
                            "key": "touch_key",
                            "value": "touch_mem_key"
                          },
                          {
                            "key": "in1",
                            "value": "in_1_st"
                          },
                          {
                            "key": "in4",
                            "value": "in_4_st"
                          },
                          {
                            "key": "in3",
                            "value": "in_3_st"
                          },
                          {
                            "key": "in5",
                            "value": "in_5_st"
                          },
                          {
                            "key": "can_fuel_volume",
                            "value": "can_fuel_rate"
                          },
                          {
                            "key": "can_engine_hours",
                            "value": "can_eng_hours"
                          },
                          {
                            "key": "can_fuel_consumpt",
                            "value": "can_fuel_level"
                          },
                          {
                            "key": "out1",
                            "value": "out_1_st"
                          },
                          {
                            "key": "accel_pedal_pos",
                            "value": "can_accel_pos"
                          }
                        ],
                        "terminal_type": {
                          "key": "navtelecom",
                          "type": "terminal_type",
                          "value": "Navtelecom"
                        }
                      },
                      {
                        "params": [
                          {
                            "key": "in1",
                            "value": "din1"
                          },
                          {
                            "key": "in3",
                            "value": "din3"
                          }
                        ],
                        "terminal_type": {
                          "key": "teltonica_fm4200",
                          "type": "terminal_type",
                          "value": "teltonica_fm4200"
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "parameters": [
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID целевой компании",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "2f2c629a-9087-4925-8240-d6d6b90aafda"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "company_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/loadwln/{company_id}/units/add_services": {
      "post": {
        "tags": [
          "Импорт из Wialon"
        ],
        "summary": "Импорт сервисных интервалов и техобслуживания из Wialon",
        "description": "Перенос интервалов ТО, моточасов и пробегов из Wialon в сервисные регламенты SKIF.",
        "operationId": "loadwlnCompanyIdUnitsAddServices",
        "parameters": [
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID целевой компании",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "2f2c629a-9087-4925-8240-d6d6b90aafda"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min"
      },
      "parameters": [
        {
          "name": "company_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/loadwln/geozones/create": {
      "post": {
        "tags": [
          "Импорт из Wialon"
        ],
        "summary": "Импорт геозон из файла Wialon/KML в активную компанию",
        "description": "Загрузка и пакетный импорт геозон в контексте текущей активной компании пользователя.",
        "operationId": "loadwlnGeozonesCreate",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies_ids": {
                    "type": "string",
                    "example": "c968398b-be00-4b4a-9e2c-7d7bdc0d43ad,c0c7d3e7-3dab-4fc8-aba6-6c8169efe3e3"
                  },
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Результат импорта геозон",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "example": true
                    },
                    "count": {
                      "type": "integer",
                      "example": 15
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "parameters": []
      }
    },
    "/api_v1/data_deletions": {
      "post": {
        "tags": [
          "Удаление данных"
        ],
        "summary": "Создание задачи удаления интервала телеметрии",
        "description": "**Удаление данных для объекта в диапазоне дат**\n\n---\n\n**Параметры:**\n\n\"start_date\": Начала интервала, в формате yyyy-MM-dd HH:mm:ss  \n\"finish_date\": Конец интервала, в формате yyyy-MM-dd HH:mm:ss  \n\"unit\": Объект, достаточно указать ID.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"start_date\": \"2022-08-01 12:30:09\",\n    \"finish_date\": \"2022-08-02 15:31:19\",\n    \"unit\": {\n        \"id\": \"97fba3d2-841b-43cd-911a-073b84ad5438\"\n    }\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"id\": \"62cc8ce7-da3d-4e1e-8086-4a8e165fcd1f\",\n    \"start_date\": \"2022-08-01 12:30:09\",\n    \"finish_date\": \"2022-08-02 15:31:19\",\n    \"unit\": {\n        \"id\": \"97fba3d2-841b-43cd-911a-073b84ad5438\"\n    }\n}\n\n ```",
        "operationId": "dataDeletions",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "finish_date": {
                    "type": "string",
                    "example": "2022-08-02 15:31:19"
                  },
                  "start_date": {
                    "type": "string",
                    "example": "2022-08-01 12:30:09"
                  },
                  "unit": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/data_deletions": {
                  "value": {
                    "finish_date": "2022-08-02 15:31:19",
                    "start_date": "2022-08-01 12:30:09",
                    "unit": {
                      "id": "97fba3d2-841b-43cd-911a-073b84ad5438"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "parameters": []
      }
    },
    "/api_v1/data_deletions/{id}": {
      "delete": {
        "tags": [
          "Удаление данных"
        ],
        "summary": "Отмена и удаление задачи очистки данных",
        "description": "**Отмена удаления данных для объекта в диапазоне дат**\n\n---\n\n**Параметры:**  \nid - ID записи\n\n---\n\n**Пример запроса:**  \nDELETE /data_deletions/62cc8ce7-da3d-4e1e-8086-4a8e165fcd1f",
        "operationId": "dataDeletionsId",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID задачи удаления",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID записи"
        }
      ]
    },
    "/api_v1/data_deletions/list": {
      "post": {
        "tags": [
          "Удаление данных"
        ],
        "summary": "Реестр задач удаления телеметрических данных",
        "description": "**Получение списка удаленных интервалов**\n\n---\n\nВ conditions можно указать фильтры:\n\n- unit.id - ID объекта\n\n- start_date - Дата, от\n\n- finish_date - Дата, до\n\n\n---\n\n**Роль:** Читатель и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"conditions\": [\n        {\n            \"field\": \"unit.id\",\n            \"value\": \"97fba3d2-841b-43cd-911a-073b84ad5438\"\n        },\n        {\n            \"field\": \"start_date\",\n            \"value\": \"2022-08-01 00:00:00\"\n        },\n        {\n            \"field\": \"finish_date\",\n            \"value\": \"2022-08-30 00:00:00\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"max\": 4,\n    \"list\": [\n        {\n            \"id\": \"5a1e36c2-a389-4a80-8acb-ec913d54df29\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"imei\": \"862531040000003\",\n            \"start_date\": \"2022-08-10 00:00:00\",\n            \"finish_date\": \"2022-08-12 00:00:00\"\n        },\n        {\n            \"id\": \"c2efec3c-5dda-4c53-904f-d79acce20537\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"imei\": \"862531040000003\",\n            \"start_date\": \"2022-08-15 00:00:00\",\n            \"finish_date\": \"2022-08-20 00:00:00\"\n        },\n        {\n            \"id\": \"4877a5cc-b26b-4aca-95c6-2bd3480f9495\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"imei\": \"862531040000003\",\n            \"start_date\": \"2022-08-18 00:00:00\",\n            \"finish_date\": \"2022-08-21 00:00:00\"\n        },\n        {\n            \"id\": \"9b0389a4-b149-4b01-9ee7-7766c58b8d4a\",\n            \"company_id\": \"3aafd100-c44d-4b04-ae93-06978b908ea9\",\n            \"imei\": \"862531040000003\",\n            \"start_date\": \"2022-08-23 02:00:00\",\n            \"finish_date\": \"2022-08-24 22:00:00\"\n        }\n    ]\n}\n\n ```",
        "operationId": "dataDeletionsList",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conditions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "example": "unit.id"
                        },
                        "value": {
                          "type": "string",
                          "example": "97fba3d2-841b-43cd-911a-073b84ad5438"
                        }
                      }
                    },
                    "example": [
                      {
                        "field": "unit.id",
                        "value": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      },
                      {
                        "field": "start_date",
                        "value": "2022-08-01 00:00:00"
                      },
                      {
                        "field": "finish_date",
                        "value": "2022-08-30 00:00:00"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/data_deletions/list": {
                  "value": {
                    "conditions": [
                      {
                        "field": "unit.id",
                        "value": "97fba3d2-841b-43cd-911a-073b84ad5438"
                      },
                      {
                        "field": "start_date",
                        "value": "2022-08-01 00:00:00"
                      },
                      {
                        "field": "finish_date",
                        "value": "2022-08-30 00:00:00"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/videos": {
      "post": {
        "tags": [
          "Видео"
        ],
        "summary": "Запрос видеопотока с видеорегистратора ТС",
        "description": "**Запрос на получение видео-потоков для регистратора, связанного с объектом**\n\n---\n\n**Параметры:**\n\nid объекта.\n\nСейчас обрабатывается только первый объект в списке.\n\n```\n{\n    \"units\": [\n        {\n            \"id\": \"d0dd6178-fd10-4f49-8627-a386ac35b8c3\"\n        }\n    ]\n}\n\n ```\n\nВ доп полях передаваемых объектов должны быть прописаны поля со соледующими ключами:\n\n1\\. Видео устройство - video_device_name  \n2\\. ID-видео устройства - video_device_id  \n3\\. Камеры (потоки) - video_cameras (числа через запятую)\n\n---\n\n**Ответ:**\n\nstream - код потока\n\nurl - url потока\n\n```\n[\n    {\n        \"stream\": \"0\",\n        \"url\": \"http://dev.skif.pro:9090/start?deviceid=019000021045&channel=1&stream=1&token=9f44b390f3a00875528d529912e535adb77aef235f8fe492661bcdcc22ae3e0a\"\n    },\n    {\n        \"stream\": \"1\",\n        \"url\": \"http://dev.skif.pro:9090/start?deviceid=019000021045&channel=2&stream=1&token=9f44b390f3a00875528d529912e535adb77aef235f8fe492661bcdcc22ae3e0a\"\n    }\n]\n\n ```\n\nВозможные виды ошибок:\n\n```\n{\n    \"code\": 5000,\n    \"message\": \"Внутренняя ошибка сервера\"\n}\n\n ```\n\nгде code - внутренний код ошибки.\n\nmessage - текст, который можно отобразить пользователю.",
        "operationId": "videos",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "d0dd6178-fd10-4f49-8627-a386ac35b8c3в"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "d0dd6178-fd10-4f49-8627-a386ac35b8c3в"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/videos": {
                  "value": {
                    "units": [
                      {
                        "id": "d0dd6178-fd10-4f49-8627-a386ac35b8c3в"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "dispatcher",
        "x-rate-limit": "30 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/units_groups_access": {
      "get": {
        "tags": [
          "Группы доступа"
        ],
        "summary": "/units_groups_access?units_group_id=units_group_id",
        "description": "**Получение списка пользователей, имеющих доступ к группе объектов**\n\n---\n\n**Параметры запроса:**\n\nunits_group_id - ID группы\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Ответ:**\n\nПриходит JSON массив. Каждый элемент имеет:\n\n- id - ID действия\n\n- key - ключ действия\n\n- name - название действия\n\n\n```\n[\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"95568a4b-9ca8-4552-95d1-d22ce5020cdc\",\n            \"name\": \"User1\"\n        }\n    },\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\",\n                \"role_key\": \"EDITOR\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            },\n            {\n                \"id\": \"262b7e97-dbfa-4288-9878-ad564672796e\",\n                \"key\": \"update_unit_name_icon\",\n                \"name\": \"Обновление названия и иконки объекта\"\n            },\n            {\n                \"id\": \"5f182c77-dfa7-4fb2-947a-2a1fc44ee83b\",\n                \"key\": \"get_unit\",\n                \"name\": \"Просмотр объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"e09239ea-b09f-4801-94c8-cc15af7606a4\",\n            \"name\": \"User2\"\n        }\n    }\n]\n\n ```",
        "operationId": "unitsGroupsAccessUnitsGroupIdUnitsGroupId",
        "parameters": [
          {
            "name": "units_group_id",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin"
      },
      "post": {
        "tags": [
          "Группы доступа"
        ],
        "summary": "/units_groups_access",
        "description": "**Создание новой группы с доступом**\n\n---\n\nname - имя группы\n\nunits - объекты\n\nusers - пользователи\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"name\": \"Newgroup5\",\n    \"units\": [\n        {\n            \"id\": \"1f6f6863-e202-4bbd-8186-11380e3b6476\"\n        }\n    ],\n    \"users\": [\n        {\n            \"id\": \"844cb9af-9158-4418-95d7-de9df14ae4d7\"\n        }\n    ]\n}\n\n ```\n\nВозвращает созданную группу. Указанные пользователи будут иметь доступ к этой группе",
        "operationId": "unitsGroupsAccess",
        "parameters": [
          {
            "name": "cookie",
            "in": "header",
            "schema": {
              "type": "string",
              "example": "__ddg1_=iXH59Du4QaAkZvHblGsa; rl_user_id=%22RudderEncrypt%3AU2FsdGVkX1837SQcSoYSWGg1LPwUmHtV7ONZrz1BFryeqgVO6dXAKzEpKdMN3%2B1F%22; PLAY_SESSION={{vault:json-web-token}}"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Newgroup5"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "1f6f6863-e202-4bbd-8186-11380e3b6476"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "1f6f6863-e202-4bbd-8186-11380e3b6476"
                      }
                    ]
                  },
                  "users": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "844cb9af-9158-4418-95d7-de9df14ae4d7"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "844cb9af-9158-4418-95d7-de9df14ae4d7"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/units_groups_access": {
                  "value": {
                    "name": "Newgroup5",
                    "units": [
                      {
                        "id": "1f6f6863-e202-4bbd-8186-11380e3b6476"
                      }
                    ],
                    "users": [
                      {
                        "id": "844cb9af-9158-4418-95d7-de9df14ae4d7"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin"
      }
    },
    "/api_v1/units_groups_access/{company_id}": {
      "get": {
        "tags": [
          "Группы доступа"
        ],
        "summary": "/units_groups_access/:company_id?units_group_id=units_group_id",
        "description": "**Получение списка пользователей, имеющих доступ к группе объектов**\n\n---\n\n**Параметры запроса:**\n\ncompany_id - ID компании\n\nunits_group_id - ID группы\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Ответ:**\n\nПриходит JSON массив. Каждый элемент имеет:\n\n- id - ID действия\n\n- key - ключ действия\n\n- name - название действия\n\n\n```\n[\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"95568a4b-9ca8-4552-95d1-d22ce5020cdc\",\n            \"name\": \"User1\"\n        }\n    },\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\",\n                \"role_key\": \"EDITOR\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            },\n            {\n                \"id\": \"262b7e97-dbfa-4288-9878-ad564672796e\",\n                \"key\": \"update_unit_name_icon\",\n                \"name\": \"Обновление названия и иконки объекта\"\n            },\n            {\n                \"id\": \"5f182c77-dfa7-4fb2-947a-2a1fc44ee83b\",\n                \"key\": \"get_unit\",\n                \"name\": \"Просмотр объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"e09239ea-b09f-4801-94c8-cc15af7606a4\",\n            \"name\": \"User2\"\n        }\n    }\n]\n\n ```",
        "operationId": "unitsGroupsAccessCompanyIdUnitsGroupIdUnitsGroupId",
        "parameters": [
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "units_group_id",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            },
            "description": "ID группы"
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin"
      },
      "parameters": [
        {
          "name": "company_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/units_groups_access/{units_group_id}": {
      "put": {
        "tags": [
          "Группы доступа"
        ],
        "summary": "/units_groups_access/:units_group_id",
        "description": "**Обновление списка пользователей, имеющих доступ к группе объектов**\n\n---\n\n**Параметры запроса:**\n\nunits_group_id - ID группы\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Ответ:**\n\nПриходит JSON массив. Каждый элемент имеет: actions и user.\n\n```\n[\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"95568a4b-9ca8-4552-95d1-d22ce5020cdc\",\n            \"name\": \"User1\"\n        }\n    },\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\",\n                \"role_key\": \"EDITOR\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            },\n            {\n                \"id\": \"262b7e97-dbfa-4288-9878-ad564672796e\",\n                \"key\": \"update_unit_name_icon\",\n                \"name\": \"Обновление названия и иконки объекта\"\n            },\n            {\n                \"id\": \"5f182c77-dfa7-4fb2-947a-2a1fc44ee83b\",\n                \"key\": \"get_unit\",\n                \"name\": \"Просмотр объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"e09239ea-b09f-4801-94c8-cc15af7606a4\",\n            \"name\": \"User2\"\n        }\n    }\n]\n\n ```\n\nЗапрос и ответ имеет структура такой же как GET /units_groups_access?units_group_id=units_group_id",
        "operationId": "unitsGroupsAccessUnitsGroupId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "actions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "_delete": {
                            "type": "boolean",
                            "example": false
                          },
                          "_unit_action": {
                            "type": "boolean",
                            "example": true
                          },
                          "id": {
                            "type": "string",
                            "example": "5a1b7d86-122a-4fe8-b364-0531db41951a"
                          },
                          "is_unit_action": {
                            "type": "boolean",
                            "example": true
                          },
                          "key": {
                            "type": "string",
                            "example": "get_unit"
                          },
                          "name": {
                            "type": "string",
                            "example": "Просмотр объекта"
                          },
                          "role_key": {
                            "type": "string",
                            "example": "READER"
                          }
                        }
                      },
                      "example": [
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                          "is_unit_action": true,
                          "key": "get_unit",
                          "name": "Просмотр объекта",
                          "role_key": "READER"
                        }
                      ]
                    },
                    "user": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "ec8dc446-f72e-4524-88be-2980c960706a"
                        },
                        "name": {
                          "type": "string",
                          "example": "hafobe2078@larland.com"
                        }
                      }
                    }
                  }
                },
                "example": [
                  {
                    "actions": [
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                        "is_unit_action": true,
                        "key": "get_unit",
                        "name": "Просмотр объекта",
                        "role_key": "READER"
                      }
                    ],
                    "user": {
                      "id": "ec8dc446-f72e-4524-88be-2980c960706a",
                      "name": "hafobe2078@larland.com"
                    }
                  },
                  {
                    "actions": [
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                        "is_unit_action": true,
                        "key": "get_unit",
                        "name": "Просмотр объекта",
                        "role_key": "READER"
                      }
                    ],
                    "user": {
                      "id": "473e1c5e-497f-4ca2-b359-0ccf1e5bb27b",
                      "name": "Офис "
                    }
                  },
                  {
                    "actions": [
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                        "is_unit_action": true,
                        "key": "update_unit",
                        "name": "Редактирование объекта",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "7c20d415-6b8c-47fe-b5d4-737e55f1f7a7",
                        "is_unit_action": true,
                        "key": "delete_unit",
                        "name": "Удаление объекта",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "e5b7aa86-36c3-49db-ad93-7fcfc4f3a790",
                        "is_unit_action": true,
                        "key": "update_unit_name_icon",
                        "name": "Обновление названия и иконки объекта",
                        "parent_id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                        "is_unit_action": true,
                        "key": "get_unit",
                        "name": "Просмотр объекта",
                        "role_key": "READER"
                      }
                    ],
                    "user": {
                      "id": "161fb066-94c8-474c-9ff4-d53daa70312c",
                      "name": "Офис1"
                    }
                  }
                ]
              },
              "examples": {
                "/units_groups_access/:units_group_id": {
                  "value": [
                    {
                      "actions": [
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                          "is_unit_action": true,
                          "key": "get_unit",
                          "name": "Просмотр объекта",
                          "role_key": "READER"
                        }
                      ],
                      "user": {
                        "id": "ec8dc446-f72e-4524-88be-2980c960706a",
                        "name": "hafobe2078@larland.com"
                      }
                    },
                    {
                      "actions": [
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                          "is_unit_action": true,
                          "key": "get_unit",
                          "name": "Просмотр объекта",
                          "role_key": "READER"
                        }
                      ],
                      "user": {
                        "id": "473e1c5e-497f-4ca2-b359-0ccf1e5bb27b",
                        "name": "Офис "
                      }
                    },
                    {
                      "actions": [
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                          "is_unit_action": true,
                          "key": "update_unit",
                          "name": "Редактирование объекта",
                          "role_key": "EDITOR"
                        },
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "7c20d415-6b8c-47fe-b5d4-737e55f1f7a7",
                          "is_unit_action": true,
                          "key": "delete_unit",
                          "name": "Удаление объекта",
                          "role_key": "EDITOR"
                        },
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "e5b7aa86-36c3-49db-ad93-7fcfc4f3a790",
                          "is_unit_action": true,
                          "key": "update_unit_name_icon",
                          "name": "Обновление названия и иконки объекта",
                          "parent_id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                          "role_key": "EDITOR"
                        },
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                          "is_unit_action": true,
                          "key": "get_unit",
                          "name": "Просмотр объекта",
                          "role_key": "READER"
                        }
                      ],
                      "user": {
                        "id": "161fb066-94c8-474c-9ff4-d53daa70312c",
                        "name": "Офис1"
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "units_group_id",
            "in": "path",
            "required": true,
            "description": "UUID группы объектов",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "units_group_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID группы"
        }
      ]
    },
    "/api_v1/units_groups_access/{company_id}/{units_group_id}": {
      "put": {
        "tags": [
          "Группы доступа"
        ],
        "summary": "/units_groups_access/:company_id/:units_group_id",
        "description": "**Обновление списка пользователей, имеющих доступ к группе объектов**\n\n---\n\n**Параметры запроса:**\n\ncompany_id - ID компании\n\nunits_group_id - ID группы\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Ответ:**\n\nПриходит JSON массив. Каждый элемент имеет: actions и user\n\n```\n[\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"95568a4b-9ca8-4552-95d1-d22ce5020cdc\",\n            \"name\": \"User1\"\n        }\n    },\n    {\n        \"actions\": [\n            {\n                \"id\": \"8a94afa3-2f4d-4cae-84ed-05197e412e56\",\n                \"key\": \"update_unit\",\n                \"name\": \"Редактирование объекта\",\n                \"role_key\": \"EDITOR\"\n            },\n            {\n                \"id\": \"fb369ecf-4446-45e7-9835-57bad481f161\",\n                \"key\": \"delete_unit\",\n                \"name\": \"Удаление объекта\"\n            },\n            {\n                \"id\": \"415b7e76-3c57-439c-bbb9-1b1e7eb78a0f\",\n                \"key\": \"update_unit_imei\",\n                \"name\": \"Изменение IMEI объекта\"\n            },\n            {\n                \"id\": \"262b7e97-dbfa-4288-9878-ad564672796e\",\n                \"key\": \"update_unit_name_icon\",\n                \"name\": \"Обновление названия и иконки объекта\"\n            },\n            {\n                \"id\": \"5f182c77-dfa7-4fb2-947a-2a1fc44ee83b\",\n                \"key\": \"get_unit\",\n                \"name\": \"Просмотр объекта\"\n            }\n        ],\n        \"user\": {\n            \"id\": \"e09239ea-b09f-4801-94c8-cc15af7606a4\",\n            \"name\": \"User2\"\n        }\n    }\n]\n\n ```\n\nЗапрос и ответ имеют такую же структуру, как GET /units_groups_access?units_group_id=units_group_id",
        "operationId": "unitsGroupsAccessCompanyIdUnitsGroupId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "actions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "_delete": {
                            "type": "boolean",
                            "example": false
                          },
                          "_unit_action": {
                            "type": "boolean",
                            "example": true
                          },
                          "id": {
                            "type": "string",
                            "example": "5a1b7d86-122a-4fe8-b364-0531db41951a"
                          },
                          "is_unit_action": {
                            "type": "boolean",
                            "example": true
                          },
                          "key": {
                            "type": "string",
                            "example": "get_unit"
                          },
                          "name": {
                            "type": "string",
                            "example": "Просмотр объекта"
                          },
                          "role_key": {
                            "type": "string",
                            "example": "READER"
                          }
                        }
                      },
                      "example": [
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                          "is_unit_action": true,
                          "key": "get_unit",
                          "name": "Просмотр объекта",
                          "role_key": "READER"
                        }
                      ]
                    },
                    "available_actions_keys": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "example": "update_unit"
                      },
                      "example": [
                        "update_unit",
                        "delete_unit",
                        "update_unit_imei",
                        "update_unit_name_icon",
                        "get_unit"
                      ]
                    },
                    "user": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "1445da1b-6976-492a-8df0-7e790e69e553"
                        },
                        "name": {
                          "type": "string",
                          "example": "Ivan"
                        },
                        "role": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "example": "6592d562-e965-43bd-9d9e-8319cabd6291"
                            },
                            "key": {
                              "type": "string",
                              "example": "OPERATOR"
                            },
                            "value": {
                              "type": "string",
                              "example": "Оператор"
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "example": [
                  {
                    "actions": [
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                        "is_unit_action": true,
                        "key": "get_unit",
                        "name": "Просмотр объекта",
                        "role_key": "READER"
                      }
                    ],
                    "available_actions_keys": [
                      "update_unit",
                      "delete_unit",
                      "update_unit_imei",
                      "update_unit_name_icon",
                      "get_unit"
                    ],
                    "user": {
                      "id": "1445da1b-6976-492a-8df0-7e790e69e553",
                      "name": "Ivan",
                      "role": {
                        "id": "6592d562-e965-43bd-9d9e-8319cabd6291",
                        "key": "OPERATOR",
                        "value": "Оператор"
                      }
                    }
                  },
                  {
                    "actions": [
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                        "is_unit_action": true,
                        "key": "update_unit",
                        "name": "Редактирование объекта",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "7c20d415-6b8c-47fe-b5d4-737e55f1f7a7",
                        "is_unit_action": true,
                        "key": "delete_unit",
                        "name": "Удаление объекта",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "0e83be60-b808-4f06-b6db-e01377720d47",
                        "is_unit_action": true,
                        "key": "update_unit_imei",
                        "name": "Изменение IMEI объекта",
                        "parent_id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": true,
                        "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                        "is_unit_action": true,
                        "key": "get_unit",
                        "name": "Просмотр объекта",
                        "role_key": "READER"
                      }
                    ],
                    "available_actions_keys": [
                      "update_unit",
                      "delete_unit",
                      "update_unit_imei",
                      "update_unit_name_icon",
                      "get_unit"
                    ],
                    "user": {
                      "id": "8462404e-99a9-4226-ae14-2f59e0400768",
                      "name": "vayokor918@ikumaru.com",
                      "role": {
                        "id": "ed858ec5-a3c7-4901-9078-efc65a350b93",
                        "key": "ADMIN",
                        "value": "Новая роль1124124"
                      }
                    }
                  }
                ]
              },
              "examples": {
                "/units_groups_access/:company_id/:units_group_id": {
                  "value": [
                    {
                      "actions": [
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                          "is_unit_action": true,
                          "key": "get_unit",
                          "name": "Просмотр объекта",
                          "role_key": "READER"
                        }
                      ],
                      "available_actions_keys": [
                        "update_unit",
                        "delete_unit",
                        "update_unit_imei",
                        "update_unit_name_icon",
                        "get_unit"
                      ],
                      "user": {
                        "id": "1445da1b-6976-492a-8df0-7e790e69e553",
                        "name": "Ivan",
                        "role": {
                          "id": "6592d562-e965-43bd-9d9e-8319cabd6291",
                          "key": "OPERATOR",
                          "value": "Оператор"
                        }
                      }
                    },
                    {
                      "actions": [
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                          "is_unit_action": true,
                          "key": "update_unit",
                          "name": "Редактирование объекта",
                          "role_key": "EDITOR"
                        },
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "7c20d415-6b8c-47fe-b5d4-737e55f1f7a7",
                          "is_unit_action": true,
                          "key": "delete_unit",
                          "name": "Удаление объекта",
                          "role_key": "EDITOR"
                        },
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "0e83be60-b808-4f06-b6db-e01377720d47",
                          "is_unit_action": true,
                          "key": "update_unit_imei",
                          "name": "Изменение IMEI объекта",
                          "parent_id": "c7d844c5-ede8-41bb-8679-9a1782815c20",
                          "role_key": "EDITOR"
                        },
                        {
                          "_delete": false,
                          "_unit_action": true,
                          "id": "5a1b7d86-122a-4fe8-b364-0531db41951a",
                          "is_unit_action": true,
                          "key": "get_unit",
                          "name": "Просмотр объекта",
                          "role_key": "READER"
                        }
                      ],
                      "available_actions_keys": [
                        "update_unit",
                        "delete_unit",
                        "update_unit_imei",
                        "update_unit_name_icon",
                        "get_unit"
                      ],
                      "user": {
                        "id": "8462404e-99a9-4226-ae14-2f59e0400768",
                        "name": "vayokor918@ikumaru.com",
                        "role": {
                          "id": "ed858ec5-a3c7-4901-9078-efc65a350b93",
                          "key": "ADMIN",
                          "value": "Новая роль1124124"
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "units_group_id",
            "in": "path",
            "required": true,
            "description": "UUID группы объектов",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "company_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        },
        {
          "name": "units_group_id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID группы"
        }
      ]
    },
    "/api_v1/send_push": {
      "post": {
        "tags": [
          "Другое"
        ],
        "summary": "Отправка мобильного Push-уведомления (FCM)",
        "description": "**Отправка push-уведомлений пользователям компаний дилера**\n\n---\n\n**Параметры:**\n\ntitle - тема\n\nbody - текст уведомления\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n1. Отправка всем пользователям компаний дилера\n\n\n``` json\n{\n    \"title\": \"Тест\",\n    \"body\": \"Проверка пуш\"\n}\n\n ```\n\n2\\. Отправка всем пользователям конкретной компании, в поле company_id указать ID компании\n\n``` json\n{\n    \"title\": \"Тест\",\n    \"body\": \"Проверка пуш\",\n    \"company_id\": \"5fb53281-23b1-42ac-a336-315edcd0a30e\"\n}\n\n ```\n\n3\\. Отправка конкретному пользователю, указать в поле user_id ID пользователя\n\n``` json\n{\n  \"title\": \"Тест\",\n  \"body\": \"Проверка пуш\",\n  \"user_id\": \"1c74912a-ebcd-47e0-8828-8bcfcc7ef59d\"\n}\n\n ```",
        "operationId": "sendPush",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "body": {
                    "type": "string",
                    "example": "Проверка пуш"
                  },
                  "title": {
                    "type": "string",
                    "example": "Тест"
                  }
                }
              },
              "examples": {
                "/send_push": {
                  "value": {
                    "body": "Проверка пуш",
                    "title": "Тест"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": []
      }
    },
    "/api_v1/branding": {
      "get": {
        "tags": [
          "Другое"
        ],
        "summary": "Получение настроек брендирования (White-label)",
        "description": "**Получение брендинга по текущему домену**\n\n---\n\nПоля, необходимые для фронта:\n\n1. Название \\[Текст\\]: Название компании интегратора. Это название будет заменять название “SKIF.PRO” в системе. - title\n\n2. Логотип \\[Изображение\\]: Логотип компании интегратора, данный логотип будет отображаться в интерфейсе системы. - logo\n\n3. Ссылка на сайт интегратора \\[Текст\\]: Гиперссылка (интегратор может дать ссылку на свой сайт). Ссылка срабатывает при клике на Логотип или Название (в email письмах). Необязательные данные. - site\n\n4. Обложка для страницы входа \\[Изображение\\]: Изображение которое отображается на странице входа (логина). Необязательные данные. Если изображение от интегратора нет, то используется стандартное обложка (важно: не обложка SKIF.PRO, а стандартная обложка).- background\n\n5. Контакты \\[Текст\\]: Любая текстовая информация от интегратора, предполагается что это будет контактная информация техподдержки (не более 320 символов) - contacts\n\n\nДля получение файлов логотипа и Обложки для страницы входа вызывать /api_v1/<значение поля logo> и /api_v1/<значение поля background>",
        "operationId": "branding",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-min-role": "unauthorized",
        "x-rate-limit": "120 req/min",
        "parameters": []
      }
    },
    "/api_v1/roles": {
      "get": {
        "tags": [
          "Роли"
        ],
        "summary": "/roles",
        "description": "**Получение всех ролей**\n\n---\n\nСтруктура роли :\n\n- id - uuid, идентификатор роли.\n\n- key - string, ключ роли.\n\n- value - string, название роли\n\n- is_default - boolean, true, если роль по умолчанию для всех компаний, иначе только для текущий компании.\n\n- actions - массив действий.\n\n\nЭлементы действий имеют такую структуру:\n\n- id - uuid, идентификатор действия.\n\n- key - string, ключ действия.\n\n- name - string, название действия.\n\n\n---\n\n**Пример ответа:**\n\n```\n[\n    {\n        \"id\": \"3fbd6629-f854-46e9-a190-cae0eb7fb5f0\",\n        \"is_default\": true,\n        \"key\": \"NO_ACCESS\",\n        \"value\": \"Без доступа\",\n        \"actions\": []\n    },\n    {\n        \"id\": \"808942ea-a102-47cb-889d-859b182f160c\",\n        \"is_default\": true,\n        \"key\": \"OBSERVER\",\n        \"value\": \"Наблюдатель\",\n        \"actions\": [\n            {\n                \"id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"key\": \"generate_report\",\n                \"name\": \"Генерация отчетов\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"fd7ee65f-5fd3-46c8-ad39-ce1227816ed6\",\n                \"key\": \"generate_journal\",\n                \"name\": \"Смотреть Журнала\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"0fd9f710-cad6-4a8c-bd5d-59f1332b8d52\",\n                \"key\": \"generate_other_reports\",\n                \"name\": \"Генерация отчета(Кроме журнала)\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            }\n        ]\n    },\n    {\n        \"id\": \"7d7292e4-e246-44e1-ac70-b1c7f23e464c\",\n        \"is_default\": true,\n        \"key\": \"READER\",\n        \"value\": \"Читатель\",\n        \"actions\": [\n            {\n                \"id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"key\": \"generate_report\",\n                \"name\": \"Генерация отчетов\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"fd7ee65f-5fd3-46c8-ad39-ce1227816ed6\",\n                \"key\": \"generate_journal\",\n                \"name\": \"Смотреть Журнала\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"0fd9f710-cad6-4a8c-bd5d-59f1332b8d52\",\n                \"key\": \"generate_other_reports\",\n                \"name\": \"Генерация отчета(Кроме журнала)\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"fff20839-8dbc-46ad-98bf-0f01d91ff184\",\n                \"key\": \"get_units\",\n                \"name\": \"Просмотр всех объектов\",\n                \"role_key\": \"READER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"c3be2a31-04be-4531-bf79-d67490e42453\",\n                \"key\": \"get_users\",\n                \"name\": \"Чтение справочника пользователей\",\n                \"role_key\": \"READER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            }\n        ]\n    },\n    {\n        \"id\": \"6592d562-e965-43bd-9d9e-8319cabd6291\",\n        \"is_default\": true,\n        \"key\": \"OPERATOR\",\n        \"value\": \"Оператор\",\n        \"actions\": [\n            {\n                \"id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"key\": \"generate_report\",\n                \"name\": \"Генерация отчетов\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"fd7ee65f-5fd3-46c8-ad39-ce1227816ed6\",\n                \"key\": \"generate_journal\",\n                \"name\": \"Смотреть Журнала\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"0fd9f710-cad6-4a8c-bd5d-59f1332b8d52\",\n                \"key\": \"generate_other_reports\",\n                \"name\": \"Генерация отчета(Кроме журнала)\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"441a9b9f-ac5d-4f90-8c2a-98d3ac7121af\",\n                \"key\": \"cud_events\",\n                \"name\": \"Создание/Редактирование/Удаление Событий\",\n                \"role_key\": \"OPERATOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"fff20839-8dbc-46ad-98bf-0f01d91ff184\",\n                \"key\": \"get_units\",\n                \"name\": \"Просмотр всех объектов\",\n                \"role_key\": \"READER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"c3be2a31-04be-4531-bf79-d67490e42453\",\n                \"key\": \"get_users\",\n                \"name\": \"Чтение справочника пользователей\",\n                \"role_key\": \"READER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"48138886-6220-41fe-adbe-72e479d8e22d\",\n                \"key\": \"commands\",\n                \"name\": \"Отправка Команд\",\n                \"role_key\": \"OPERATOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            }\n        ]\n    },\n    {\n        \"id\": \"8ae01b09-95dc-445a-8b92-b570cfa94a04\",\n        \"is_default\": true,\n        \"key\": \"EDITOR\",\n        \"value\": \"Редактор\",\n        \"actions\": [\n            {\n                \"id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"key\": \"generate_report\",\n                \"name\": \"Генерация отчетов\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"fd7ee65f-5fd3-46c8-ad39-ce1227816ed6\",\n                \"key\": \"generate_journal\",\n                \"name\": \"Смотреть Журнала\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"0fd9f710-cad6-4a8c-bd5d-59f1332b8d52\",\n                \"key\": \"generate_other_reports\",\n                \"name\": \"Генерация отчета(Кроме журнала)\",\n                \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n                \"role_key\": \"OBSERVER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"4132cf99-98fd-47d0-a7c5-fbd2fa167336\",\n                \"key\": \"create_units\",\n                \"name\": \"Создание объектов\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n                \"key\": \"cud_geozones\",\n                \"name\": \"Создание/Редактирование/Удаление Геозон\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"77d71ff0-bb6c-447c-af3c-4c0fbe17b5c9\",\n                \"key\": \"cud_notifications\",\n                \"name\": \"Создание/Редактирование/Удаление Шаблонов Уведомлений\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"405bb5f4-d0f0-44cc-9550-4f44f1ae9d61\",\n                \"key\": \"cud_trips\",\n                \"name\": \"Создание/Редактирование/Удаление Рейсов\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"aace4f55-fcf5-4aba-ba32-d3a2335b76e2\",\n                \"key\": \"cud_mailings\",\n                \"name\": \"Создание/Редактирование/Удаление Рассылок\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"1e79a78d-4ed6-494d-90e4-2ebbd15e80bd\",\n                \"key\": \"cud_trailers\",\n                \"name\": \"Создание/Редактирование/Удаление Прицепов\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"ede4829f-9ecf-474c-ba20-a2b00c687591\",\n                \"key\": \"cud_units_groups\",\n                \"name\": \"Создание/Редактирование/Удаление Групп\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n                \"key\": \"cud_report_templates\",\n                \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"441a9b9f-ac5d-4f90-8c2a-98d3ac7121af\",\n                \"key\": \"cud_events\",\n                \"name\": \"Создание/Редактирование/Удаление Событий\",\n                \"role_key\": \"OPERATOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"d95323ae-0b58-4e91-a7e5-1e862fa07a85\",\n                \"key\": \"update_units\",\n                \"name\": \"Редактирование всех объектов\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"e4de9d83-fb37-447e-855a-1ee81902490f\",\n                \"key\": \"delete_units\",\n                \"name\": \"Удаление всех объектов\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"fff20839-8dbc-46ad-98bf-0f01d91ff184\",\n                \"key\": \"get_units\",\n                \"name\": \"Просмотр всех объектов\",\n                \"role_key\": \"READER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"c3be2a31-04be-4531-bf79-d67490e42453\",\n                \"key\": \"get_users\",\n                \"name\": \"Чтение справочника пользователей\",\n                \"role_key\": \"READER\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"877ea798-f16d-490f-ab1c-218ab172a244\",\n                \"key\": \"cud_locators\",\n                \"name\": \"Создание/Редактирование/Удаление/Просмотр Ссылки доступа\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"48138886-6220-41fe-adbe-72e479d8e22d\",\n                \"key\": \"commands\",\n                \"name\": \"Отправка Команд\",\n                \"role_key\": \"OPERATOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            }\n        ]\n    },\n    {\n        \"id\": \"2c34a621-b048-494b-bc50-80ec835fed17\",\n        \"is_default\": false,\n        \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n        \"key\": \"EDITOR\",\n        \"value\": \"Редактор геозон и шаблонов отчетов\",\n        \"actions\": [\n            {\n                \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n                \"key\": \"cud_geozones\",\n                \"name\": \"Создание/Редактирование/Удаление Геозон\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n                \"key\": \"cud_report_templates\",\n                \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n                \"role_key\": \"EDITOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            }\n        ]\n    },\n    {\n        \"id\": \"41607791-8948-460b-8950-d60a9c57c372\",\n        \"is_default\": true,\n        \"key\": \"ADMIN\",\n        \"value\": \"Администратор\",\n        \"actions\": [\n            {\n                \"id\": \"6da12577-da5c-426d-8626-5ad628adcb29\",\n                \"key\": \"cud_users\",\n                \"name\": \"Изменение справочника пользователей\",\n                \"role_key\": \"ADMIN\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            }\n        ]\n    },\n    {\n        \"id\": \"d9566448-3518-4389-8a39-662f4d6e71ec\",\n        \"is_default\": true,\n        \"key\": \"SUPERVISOR\",\n        \"value\": \"Супервизор\",\n        \"actions\": [\n            {\n                \"id\": \"116e6564-2aa3-4783-9b08-e6a0bbfddec9\",\n                \"key\": \"cud_terminals\",\n                \"name\": \"Создание/Редактирование/Удаление Терминалов\",\n                \"role_key\": \"SUPERVISOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"487de2c6-7b5e-40a1-83d7-d0f25331d9b7\",\n                \"key\": \"cud_company\",\n                \"name\": \"Создание/Редактирование компании\",\n                \"role_key\": \"SUPERVISOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            },\n            {\n                \"id\": \"9f0c1c49-7a06-4474-b051-610588317502\",\n                \"key\": \"delete_company\",\n                \"name\": \"Удаление компаний\",\n                \"role_key\": \"SUPERVISOR\",\n                \"is_unit_action\": false,\n                \"_unit_action\": false,\n                \"_delete\": false\n            }\n        ]\n    }\n]\n\n ```",
        "operationId": "roles",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "string",
              "example": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin"
      },
      "post": {
        "tags": [
          "Роли"
        ],
        "summary": "/roles",
        "description": "**Создание новой роли в компании**\n\n---\n\n**Структура запроса:**\n\n- value - string, название новой роли.\n\n- actions - массив действий, выбранный из списка действий базовой роли.\n\n\nДля создания в админ панеле, необходимо указать ID компании в поле company_id\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"value\": \"Редактор геозон и шаблонов отчетов\",\n    \"actions\": [\n        {\n            \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n            \"key\": \"cud_geozones\",\n            \"name\": \"Создание/Редактирование/Удаление Геозон\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        },\n        {\n            \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n            \"key\": \"cud_report_templates\",\n            \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"id\": \"2c34a621-b048-494b-bc50-80ec835fed17\",\n    \"is_default\": false,\n    \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n    \"key\": \"EDITOR\",\n    \"value\": \"Редактор геозон и шаблонов отчетов\",\n    \"actions\": [\n        {\n            \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n            \"key\": \"cud_geozones\",\n            \"name\": \"Создание/Редактирование/Удаление Геозон\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        },\n        {\n            \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n            \"key\": \"cud_report_templates\",\n            \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        }\n    ],\n    \"_default\": false\n}\n\n ```",
        "operationId": "roles1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "actions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "_delete": {
                          "type": "boolean",
                          "example": false
                        },
                        "_unit_action": {
                          "type": "boolean",
                          "example": false
                        },
                        "id": {
                          "type": "string",
                          "example": "1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91"
                        },
                        "is_unit_action": {
                          "type": "boolean",
                          "example": false
                        },
                        "key": {
                          "type": "string",
                          "example": "cud_geozones"
                        },
                        "name": {
                          "type": "string",
                          "example": "Создание/Редактирование/Удаление Геозон"
                        },
                        "role_key": {
                          "type": "string",
                          "example": "EDITOR"
                        }
                      }
                    },
                    "example": [
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91",
                        "is_unit_action": false,
                        "key": "cud_geozones",
                        "name": "Создание/Редактирование/Удаление Геозон",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "f9df739b-9e3a-4feb-80c4-a3a1519d0b54",
                        "is_unit_action": false,
                        "key": "cud_report_templates",
                        "name": "Создание/Редактирование/Удаление Шаблонов отчетов",
                        "role_key": "EDITOR"
                      }
                    ]
                  },
                  "key": {
                    "type": "string",
                    "example": "EDITOR"
                  },
                  "value": {
                    "type": "string",
                    "example": "Редактор геозон и шаблонов отчетов 444"
                  }
                }
              },
              "examples": {
                "/roles": {
                  "value": {
                    "actions": [
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91",
                        "is_unit_action": false,
                        "key": "cud_geozones",
                        "name": "Создание/Редактирование/Удаление Геозон",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "f9df739b-9e3a-4feb-80c4-a3a1519d0b54",
                        "is_unit_action": false,
                        "key": "cud_report_templates",
                        "name": "Создание/Редактирование/Удаление Шаблонов отчетов",
                        "role_key": "EDITOR"
                      }
                    ],
                    "key": "EDITOR",
                    "value": "Редактор геозон и шаблонов отчетов 444"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/actions": {
      "get": {
        "tags": [
          "Роли"
        ],
        "summary": "/actions",
        "description": "**Получение всех действий**\n\n---\n\nВозвращается массив действий.\n\nЭлементы действий имеют такую структуру:\n\n- id - uuid, идентификатор действия.\n\n- key - string, ключ действия.\n\n- name - string, название действия.\n\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример ответа:**\n\n```\n[\n    {\n        \"id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n        \"key\": \"generate_report\",\n        \"name\": \"Генерация отчетов\",\n        \"role_key\": \"OBSERVER\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"fd7ee65f-5fd3-46c8-ad39-ce1227816ed6\",\n        \"key\": \"generate_journal\",\n        \"name\": \"Смотреть Журнала\",\n        \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n        \"role_key\": \"OBSERVER\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"0fd9f710-cad6-4a8c-bd5d-59f1332b8d52\",\n        \"key\": \"generate_other_reports\",\n        \"name\": \"Генерация отчета(Кроме журнала)\",\n        \"parent_id\": \"3185300e-e471-4fdd-ad80-4c73288f58f4\",\n        \"role_key\": \"OBSERVER\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"5a1b7d86-122a-4fe8-b364-0531db41951a\",\n        \"key\": \"get_unit\",\n        \"name\": \"Просмотр объекта\",\n        \"role_key\": \"READER\",\n        \"is_unit_action\": true,\n        \"_unit_action\": true,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"fff20839-8dbc-46ad-98bf-0f01d91ff184\",\n        \"key\": \"get_units\",\n        \"name\": \"Просмотр всех объектов\",\n        \"role_key\": \"READER\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"c3be2a31-04be-4531-bf79-d67490e42453\",\n        \"key\": \"get_users\",\n        \"name\": \"Чтение справочника пользователей\",\n        \"role_key\": \"READER\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"441a9b9f-ac5d-4f90-8c2a-98d3ac7121af\",\n        \"key\": \"cud_events\",\n        \"name\": \"Создание/Редактирование/Удаление Событий\",\n        \"role_key\": \"OPERATOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"48138886-6220-41fe-adbe-72e479d8e22d\",\n        \"key\": \"commands\",\n        \"name\": \"Отправка Команд\",\n        \"role_key\": \"OPERATOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"4132cf99-98fd-47d0-a7c5-fbd2fa167336\",\n        \"key\": \"create_units\",\n        \"name\": \"Создание объектов\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n        \"key\": \"cud_geozones\",\n        \"name\": \"Создание/Редактирование/Удаление Геозон\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"77d71ff0-bb6c-447c-af3c-4c0fbe17b5c9\",\n        \"key\": \"cud_notifications\",\n        \"name\": \"Создание/Редактирование/Удаление Шаблонов Уведомлений\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"405bb5f4-d0f0-44cc-9550-4f44f1ae9d61\",\n        \"key\": \"cud_trips\",\n        \"name\": \"Создание/Редактирование/Удаление Рейсов\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"aace4f55-fcf5-4aba-ba32-d3a2335b76e2\",\n        \"key\": \"cud_mailings\",\n        \"name\": \"Создание/Редактирование/Удаление Рассылок\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"1e79a78d-4ed6-494d-90e4-2ebbd15e80bd\",\n        \"key\": \"cud_trailers\",\n        \"name\": \"Создание/Редактирование/Удаление Прицепов\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"ede4829f-9ecf-474c-ba20-a2b00c687591\",\n        \"key\": \"cud_units_groups\",\n        \"name\": \"Создание/Редактирование/Удаление Групп\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n        \"key\": \"cud_report_templates\",\n        \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"c7d844c5-ede8-41bb-8679-9a1782815c20\",\n        \"key\": \"update_unit\",\n        \"name\": \"Редактирование объекта\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": true,\n        \"_unit_action\": true,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"7c20d415-6b8c-47fe-b5d4-737e55f1f7a7\",\n        \"key\": \"delete_unit\",\n        \"name\": \"Удаление объекта\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": true,\n        \"_unit_action\": true,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"0e83be60-b808-4f06-b6db-e01377720d47\",\n        \"key\": \"update_unit_imei\",\n        \"name\": \"Изменение IMEI объекта\",\n        \"parent_id\": \"c7d844c5-ede8-41bb-8679-9a1782815c20\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": true,\n        \"_unit_action\": true,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"e5b7aa86-36c3-49db-ad93-7fcfc4f3a790\",\n        \"key\": \"update_unit_name_icon\",\n        \"name\": \"Обновление названия и иконки объекта\",\n        \"parent_id\": \"c7d844c5-ede8-41bb-8679-9a1782815c20\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": true,\n        \"_unit_action\": true,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"d95323ae-0b58-4e91-a7e5-1e862fa07a85\",\n        \"key\": \"update_units\",\n        \"name\": \"Редактирование всех объектов\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"e4de9d83-fb37-447e-855a-1ee81902490f\",\n        \"key\": \"delete_units\",\n        \"name\": \"Удаление всех объектов\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"877ea798-f16d-490f-ab1c-218ab172a244\",\n        \"key\": \"cud_locators\",\n        \"name\": \"Создание/Редактирование/Удаление/Просмотр Ссылки доступа\",\n        \"role_key\": \"EDITOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"6da12577-da5c-426d-8626-5ad628adcb29\",\n        \"key\": \"cud_users\",\n        \"name\": \"Изменение справочника пользователей\",\n        \"role_key\": \"ADMIN\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"6dddfa19-2f20-4d5e-929e-2b489430a1cb\",\n        \"key\": \"finance_report\",\n        \"name\": \"Доступ к финансовому отчету\",\n        \"role_key\": \"ADMIN\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"f478bb8c-ad0c-4595-b9a6-a1198fc69bda\",\n        \"key\": \"cud_roles\",\n        \"name\": \"Изменение ролей\",\n        \"role_key\": \"ADMIN\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"116e6564-2aa3-4783-9b08-e6a0bbfddec9\",\n        \"key\": \"cud_terminals\",\n        \"name\": \"Создание/Редактирование/Удаление Терминалов\",\n        \"role_key\": \"SUPERVISOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"487de2c6-7b5e-40a1-83d7-d0f25331d9b7\",\n        \"key\": \"cud_company\",\n        \"name\": \"Создание/Редактирование компании\",\n        \"role_key\": \"SUPERVISOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    },\n    {\n        \"id\": \"9f0c1c49-7a06-4474-b051-610588317502\",\n        \"key\": \"delete_company\",\n        \"name\": \"Удаление компаний\",\n        \"role_key\": \"SUPERVISOR\",\n        \"is_unit_action\": false,\n        \"_unit_action\": false,\n        \"_delete\": false\n    }\n]\n\n ```",
        "operationId": "actions",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": []
      }
    },
    "/api_v1/roles/{id}": {
      "put": {
        "tags": [
          "Роли"
        ],
        "summary": "/roles/:id",
        "description": "**Обновление роли в компании**\n\n---\n\n**Параметр запроса:**\n\nID роли\n\nСтруктура тела запроса JSON, как при создании POST /roles\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n```\n{\n    \"id\": \"2c34a621-b048-494b-bc50-80ec835fed17\",\n    \"is_default\": false,\n    \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n    \"value\": \"Редактор геозон и шаблонов отчетов\",\n    \"actions\": [\n        {\n            \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n            \"key\": \"cud_geozones\",\n            \"name\": \"Создание/Редактирование/Удаление Геозон\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        },\n        {\n            \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n            \"key\": \"cud_report_templates\",\n            \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        }\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"id\": \"2c34a621-b048-494b-bc50-80ec835fed17\",\n    \"is_default\": false,\n    \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n    \"key\": \"EDITOR\",\n    \"value\": \"Редактор геозон и шаблонов отчетов\",\n    \"actions\": [\n        {\n            \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n            \"key\": \"cud_geozones\",\n            \"name\": \"Создание/Редактирование/Удаление Геозон\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        },\n        {\n            \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n            \"key\": \"cud_report_templates\",\n            \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        }\n    ]\n}\n\n ```",
        "operationId": "rolesId",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "_default": {
                    "type": "boolean",
                    "example": false
                  },
                  "actions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "_delete": {
                          "type": "boolean",
                          "example": false
                        },
                        "_unit_action": {
                          "type": "boolean",
                          "example": false
                        },
                        "id": {
                          "type": "string",
                          "example": "1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91"
                        },
                        "is_unit_action": {
                          "type": "boolean",
                          "example": false
                        },
                        "key": {
                          "type": "string",
                          "example": "cud_geozones"
                        },
                        "name": {
                          "type": "string",
                          "example": "Создание/Редактирование/Удаление Геозон"
                        },
                        "role_key": {
                          "type": "string",
                          "example": "EDITOR"
                        }
                      }
                    },
                    "example": [
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91",
                        "is_unit_action": false,
                        "key": "cud_geozones",
                        "name": "Создание/Редактирование/Удаление Геозон",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "f9df739b-9e3a-4feb-80c4-a3a1519d0b54",
                        "is_unit_action": false,
                        "key": "cud_report_templates",
                        "name": "Создание/Редактирование/Удаление Шаблонов отчетов",
                        "role_key": "EDITOR"
                      }
                    ]
                  },
                  "company_id": {
                    "type": "string",
                    "example": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                  },
                  "id": {
                    "type": "string",
                    "example": "0f31eeb6-f5f5-4170-a8ac-9b2ec79f1170"
                  },
                  "is_default": {
                    "type": "boolean",
                    "example": false
                  },
                  "key": {
                    "type": "string",
                    "example": "EDITOR"
                  },
                  "users_count": {
                    "type": "number",
                    "example": 0
                  },
                  "value": {
                    "type": "string",
                    "example": "Редактор геозон и шаблонов отчетов 888"
                  }
                }
              },
              "examples": {
                "/roles/:id": {
                  "value": {
                    "_default": false,
                    "actions": [
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91",
                        "is_unit_action": false,
                        "key": "cud_geozones",
                        "name": "Создание/Редактирование/Удаление Геозон",
                        "role_key": "EDITOR"
                      },
                      {
                        "_delete": false,
                        "_unit_action": false,
                        "id": "f9df739b-9e3a-4feb-80c4-a3a1519d0b54",
                        "is_unit_action": false,
                        "key": "cud_report_templates",
                        "name": "Создание/Редактирование/Удаление Шаблонов отчетов",
                        "role_key": "EDITOR"
                      }
                    ],
                    "company_id": "3e70f167-9fad-4753-bccf-d7d47c2c648c",
                    "id": "0f31eeb6-f5f5-4170-a8ac-9b2ec79f1170",
                    "is_default": false,
                    "key": "EDITOR",
                    "users_count": 0,
                    "value": "Редактор геозон и шаблонов отчетов 888"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID роли",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "Роли"
        ],
        "summary": "/roles/:id",
        "description": "**Обновление роли в компании**\n\n---\n\nПараметр запроса - ID роли\n\nВ теле запроса необходимо указать роль для замены ролей пользователей в поле replace_role, если есть пользователи для этой роли. Достаточно указать ID роли.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Пример запроса:**\n\n[https://api.skif.pro/api_v1/roles/1f21bbe2-797f-4d16-9667-70211ab3412c](https://api.skif.pro/api_v1/roles/1f21bbe2-797f-4d16-9667-70211ab3412c)\n\n```\n{\n   \"replace_role\": {\n       \"id\": \"3476edf5-d2c9-405c-9dfb-29618c47c807\"\n   }\n}\n\n ```\n\n---\n\n**Ответ:**\n\n```\n{\n    \"id\": \"2c34a621-b048-494b-bc50-80ec835fed17\",\n    \"is_default\": false,\n    \"company_id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n    \"key\": \"EDITOR\",\n    \"name\": \"Редактор геозон и шаблонов отчетов\",\n    \"actions\": [\n        {\n            \"id\": \"1c0ff6a6-e1e6-4d20-bb86-b94cd175aa91\",\n            \"key\": \"cud_geozones\",\n            \"name\": \"Создание/Редактирование/Удаление Геозон\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        },\n        {\n            \"id\": \"f9df739b-9e3a-4feb-80c4-a3a1519d0b54\",\n            \"key\": \"cud_report_templates\",\n            \"name\": \"Создание/Редактирование/Удаление Шаблонов отчетов\",\n            \"role_key\": \"EDITOR\",\n            \"is_unit_action\": false,\n            \"_unit_action\": false,\n            \"_delete\": false\n        }\n    ]\n}\n\n ```",
        "operationId": "rolesId1",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "replace_role": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "3476edf5-d2c9-405c-9dfb-29618c47c807"
                      }
                    }
                  }
                }
              },
              "examples": {
                "/roles/:id": {
                  "value": {
                    "replace_role": {
                      "id": "3476edf5-d2c9-405c-9dfb-29618c47c807"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID роли",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID роли"
        }
      ]
    },
    "/api_v1/news": {
      "post": {
        "tags": [
          "Новости"
        ],
        "summary": "/news",
        "description": "Добавление новостей интегратором для своих компаний\n\n---\n\nПоля:\n\ntitle - загаловок новости, текстовое.\n\nmessage - текст новости, текстовое.\n\ncompanies - массив выбранных компаний, достаточно указать id.\n\nroles - массив выбранных ролей, достаточно указать key.\n\nsend_types - массив выбранных способов доставки, достаточно указать key. Выбираются из properties, где type=send_types\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\n**Пример запроса:**\n\n``` json\n{\n    \"title\": \"Обновление функционал геозон\",\n    \"message\": \"Длииное описание\",\n    \"valid_to\": \"2123-12-31 22:00:00\",\n    \"companies\": [\n        {\"id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\"},\n        {\"id\": \"f08a0297-05c3-42e5-b433-66cd72e72f61\"}\n    ],\n    \"roles\": [\n        {\"key\": \"EDITOR\"},\n        {\"key\": \"ADMIN\"}\n    ],\n    \"send_types\": [\n        {\"key\": \"send_online\"},\n        {\"key\": \"send_telegram\"}\n    ]\n}\n\n ```\n\n---\n\n**Ответ:**\n\n``` json\n{\n    \"id\": \"ddee7cdc-eee0-4db2-8430-1c9620fa543f\",\n    \"valid_to\": \"2123-12-31 22:00:00\",\n    \"title\": \"Обновление функционал геозон\",\n    \"message\": \"Длииное описание\",\n    \"companies\": [\n        {\n            \"id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n            \"name\": \"0Одуванчик\"\n        },\n        {\n            \"id\": \"f08a0297-05c3-42e5-b433-66cd72e72f61\",\n            \"name\": \"ддддддддддааааа\"\n        }\n    ],\n    \"send_types\": [\n        {\n            \"key\": \"send_online\",\n            \"type\": \"send_types\",\n            \"value\": \"Отобразить в интерфейсе SKIF.PRO\"\n        },\n        {\n            \"key\": \"send_telegram\",\n            \"type\": \"send_types\",\n            \"value\": \"Отправить в Телеграм\"\n        }\n    ],\n    \"roles\": [\n        {\n            \"key\": \"EDITOR\",\n            \"value\": \"Редактор\"\n        },\n        {\n            \"key\": \"ADMIN\",\n            \"value\": \"Администратор\"\n        }\n    ]\n}\n\n ```\n\n---\n\n**Пример ошибки:**\n\n``` json\n{\n    \"code\": 4220,\n    \"field\": \"valid_to\",\n    \"message\": \"Актуально до должно быть позже текущего времени\"\n}\n\n ```",
        "operationId": "news",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                      },
                      {
                        "id": "f08a0297-05c3-42e5-b433-66cd72e72f61"
                      }
                    ]
                  },
                  "message": {
                    "type": "string",
                    "example": "Длииное описание"
                  },
                  "roles": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "EDITOR"
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "EDITOR"
                      },
                      {
                        "key": "ADMIN"
                      }
                    ]
                  },
                  "send_types": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "example": "send_online"
                        }
                      }
                    },
                    "example": [
                      {
                        "key": "send_online"
                      },
                      {
                        "key": "send_telegram"
                      }
                    ]
                  },
                  "title": {
                    "type": "string",
                    "example": "Обновление функционал геозон"
                  },
                  "valid_to": {
                    "type": "string",
                    "example": "2123-12-31 22:00:00"
                  }
                }
              },
              "examples": {
                "/news": {
                  "value": {
                    "companies": [
                      {
                        "id": "3e70f167-9fad-4753-bccf-d7d47c2c648c"
                      },
                      {
                        "id": "f08a0297-05c3-42e5-b433-66cd72e72f61"
                      }
                    ],
                    "message": "Длииное описание",
                    "roles": [
                      {
                        "key": "EDITOR"
                      },
                      {
                        "key": "ADMIN"
                      }
                    ],
                    "send_types": [
                      {
                        "key": "send_online"
                      },
                      {
                        "key": "send_telegram"
                      }
                    ],
                    "title": "Обновление функционал геозон",
                    "valid_to": "2123-12-31 22:00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/news/list": {
      "post": {
        "tags": [
          "Новости"
        ],
        "summary": "/news/list",
        "description": "**Получение новостей по страницам**\n\n---\n\nФильтр отправляется в теле запроса:\n\noffset - номер первой строки, начинается с нуля.\n\nmax - максимальные количество строк на странице.\n\nsortField - поле, по которoму нужно делать сортировку (используются следующие поля - created, valid_to, title).\n\nsortDesc - тип сортировки поля, если true, тогда по убыванию.\n\n---\n\n**Пример запроса:**\n\n``` json\n{\n    \"offset\": 0,\n    \"max\": 100,\n    \"sortField\": \"created\",\n    \"sortDesc\": true\n}\n\n ```\n\n---\n\n**Пример ответа:**\n\nВозвращаются новости на указанной странице запроса.\n\nmax_rows - количество всех записей.\n\nlist - сами записи. Cтруктура записей, как в ответе на запрос POST /news, дополнительно приходит поле is_read - признак прочитанности и created - дата и время создания.\n\n``` json\n{\n    \"max_rows\": 2,\n    \"list\": [\n        {\n            \"id\": \"c37494d6-7141-41b3-b0d9-ff3c89fd159a\",\n            \"created\": \"2023-12-05 17:49:15\",\n            \"valid_to\": \"2110-12-31 22:00:00\",\n            \"title\": \"Война и мир. Роман, Лев Толстой. I том\",\n            \"message\": \"Действия I тома описывают события войны в союзе с Австрией против Наполеона в 1805—1807 годах. 1-я часть. Июль 1805 года, назревает война с «чудовищем» Буонапарте. Санкт-Петербург. Фрейлина вдовствующей императрицы Анна Шерер устраивает светский приём. Гости обсуждают последние события — убийство герцога Энгиенского, захват Наполеоном итальянских республик Генуи и Лукки, миссию Новосильцева по посредничеству между Францией и Англией. На приёме появляются князь Андрей Болконский со своей беременной женой Лизой, молодой Пьер, незаконный сын богатейшего графа Безухова, князь Василий Курагин со своей прекрасной дочерью Элен. Курагин жалуется Шерер на своих сыновей: беспутного Анатоля и глупого Ипполита. Обедневшая княгиня Анна Друбецкая просит князя Василия похлопотать о зачислении её единственного сына Бориса в гвардию. После приёма Пьер едет к Болконскому, тот убеждает его не участвовать в кутежах Анатоля Курагина. Однако тот всё равно отправляется к Анатолю, кутёж заканчивается печально: Пьера высылают в Москву, заводила Долохов разжалован в солдаты, дело с Анатолем замял отец.Москва. 26 августа[19], день святой Натальи) в большом доме графов Ростовых на Поварской празднуют именины графини Ростовой и её младшей дочери Наташи. Сын Ростова Николай готовится к отправке на войну, он влюблён в свою троюродную сестру бесприданницу Соню. Наташа Ростова тоже хочет любить кого-то, поэтому напрашивается на откровенный разговор с Борисом Друбецким и целует его. На праздник приезжает Пьер и Марья Дмитриевна Ахросимова — влиятельная и уважаемая дама, резкая и категоричная в своих суждениях. Граф Ростов, к восторгу всех присутствующих, танцует с Марьей Дмитриевной свой любимый танец — «Данилу Купора».Отец Пьера граф Безухов находится при смерти после нескольких ударов. Он просит князя Василия, родственника жены, привести к нему Пьера, самого любимого из своих сыновей. Князь Василий и три княжны Мамонтовы опасаются, что наследство может достаться Пьеру. Разобравшись, куда дует ветер, княгиня Друбецкая привозит ничего не подозревающего Пьера в дом графа и силком вырывает у княжны Мамонтовой портфель, где находится письмо графа к государю с просьбой признать Пьера законным сыном. Неожиданно Пьер становится графом, одним из богатейших людей России.Андрей Болконский назначен адьютантом Кутузова и уезжает на войну, мечтая прославиться, оставив Лизу в имении отца Лысые Горы. Его отец, генерал-аншеф князь Николай Андреевич Болконский, много лет безвыездно живёт в своём имении. Он отличается прямотой своих суждений, суровостью и строгостью. Он заставляет дочь княжну Марью заниматься математикой, постоянно третирует и оскорбляет её. Тем не менее набожная и некрасивая княжна любит отца и знает, что он любит её. Княжна Марья получает письмо от Жюли Карагиной, которая пишет о том, что, по слухам, князь Василий хочет женить на ней своего сына Анатоля.2-я часть. Австрия. Русская армия после длительного перехода участвует в смотре в местечке Браунау. На смотр приезжает главнокомандующий Кутузов. Он недоволен бравым видом армии, не желая видеть своих солдат пушечным мясом в замыслах австрийцев. После разгрома генерала Мака под Ульмом армии Кутузова приходится отступить к Кремсу. Кутузов посылает Болконского с посланием о первой русской победе к австрийскому императору Францу. После аудиенции Болконский узнаёт, что французы неожиданно прорвались в Вену, армия Кутузова оказывается под угрозой окружения. Несмотря на предложение дипломата Билибина ехать с ним, Болконский, уверенный что пришло его время, спешит к Кутузову. Кутузов решается идти к Цнайму на соединение с российскими силами. Он посылает четырёхтысячный отряд Багратиона к деревне Шёнграбен, где в отчаянном безнадёжном бою русские задерживают продвижение армии Мюрата. На совещании у Багратиона Болконский заступается за истинного героя сражения — капитана Тушина, чья батарея подожгла деревню в тылу французов и держалась, оказавшись в окружении. Павлоградский гусарский полк тоже участвовал в сражении, где Николай Ростов получает рану.3-я часть. Князь Василий поселяет дезориентированного новой жизнью Пьера у себя, намереваясь женить его на своей дочери. Он устраивает Пьеру назначение в камер-юнкеры. Постепенно светское общество начинает воспринимать Пьера как жениха Элен. Пьер испытывает к красавице влечение, но опасается, что женитьба на глупой Элен станет для него страшным несчастьем. В решающий момент князь Василий представляет дело так, будто Пьер уже объяснился Элен в любви, Пьеру приходится подчиниться. Он поселяется с женой в своём недавно отремонтированном дворце.Закончив дело с Элен, князь Василий с сыном Анатолем едет в имение старого князя Болконского. Старик разгадывает подлинную сущность Анатоля, но предоставляет свободу выбора своей дочери. Марья очарована красавцем офицером Анатолем, но застаёт его в зимнем саду со своей компаньонкой мадемуазелью Амалией Бурьен. Она решает поспособствовать счастью Амалии и говорит князю Василию, что никогда не станет женой его сына.Стороны стягивают силы к Аустерлицу. Император Александр, его приближённые уверены в победе над слабым противником, австрийцы, уже проводившие манёвры в этой местности, составили подробную диспозицию. Тем не менее Кутузов уверен, что битва будет проиграна, а диспозиция Вейротера хороша лишь тем, что уже высочайше одобрена и изменить в ней ничего всё равно нельзя.Болконский не спит накануне сражения, мечтая о славе. Если счастливый случай вознёс Бонапарта, то завтрашнее сражение может вознести и его. Болконский просит об этом Бога, ему не жаль ни семьи, ни богатства, ни даже жизни.На следующее утро Наполеон, в день годовщины его коронования, в счастливом расположении духа, уверенный в успехе, отдаёт приказ начинать дело. Французская армия спешит занять Праценские высоты, с которых спускается союзная армия. Вскоре сражение оказывается проигранным во всех пунктах. Кутузов замечает наступающую французскую колонну, русские войска разбегаются и он требует от Болконского остановить их. Болконский решив, что наступила долгожданная минута, подбирает знамя и увлекает батальон за собой. Вдруг Болконский чувствует удар по голове и падает. Недвижимый, он видит над собой лишь бескрайнее, бесконечное небо, а всё прежнее теряет всякое значение. Сам Бонапарт смотрит на Болконского («Вот прекрасная смерть!»), но заметив, что Болконский жив, обращается к нему с вопросами. Князь Андрей даже не трудится ответить, воспринимая своего прежнего кумира Бонапарта как ничтожество. Врач Наполеона Ларрей уверен, что Болконский не выживет, его и других безнадёжных раненых, оставляют на попечение местных жителей.\",\n            \"dealer_id\": \"c5e63357-6b63-4ea4-8b91-beb53f749f69\",\n            \"is_read\": false,\n            \"_read\": false,\n            \"companies\": [\n                {\n                    \"id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n                    \"name\": \"0Одуванчик\"\n                },\n                {\n                    \"id\": \"f08a0297-05c3-42e5-b433-66cd72e72f61\",\n                    \"name\": \"ддддддддддааааа\"\n                }\n            ],\n            \"send_types\": [\n                {\n                    \"key\": \"send_online\",\n                    \"type\": \"send_types\",\n                    \"value\": \"Отобразить в интерфейсе SKIF.PRO\"\n                },\n                {\n                    \"key\": \"send_telegram\",\n                    \"type\": \"send_types\",\n                    \"value\": \"Отправить в Телеграм\"\n                }\n            ],\n            \"roles\": [\n                {\n                    \"key\": \"EDITOR\",\n                    \"value\": \"Редактор\"\n                },\n                {\n                    \"key\": \"ADMIN\",\n                    \"value\": \"Администратор\"\n                }\n            ]\n        },\n        {\n            \"id\": \"6a742db8-4c06-44bf-9f69-43a8f0f0071d\",\n            \"created\": \"2023-12-05 19:19:05\",\n            \"valid_to\": \"2123-12-31 22:00:00\",\n            \"title\": \"Обновление функционал геозон\",\n            \"message\": \"Длииное описание\",\n            \"dealer_id\": \"c5e63357-6b63-4ea4-8b91-beb53f749f69\",\n            \"is_read\": true,\n            \"_read\": true,\n            \"companies\": [\n                {\n                    \"id\": \"3e70f167-9fad-4753-bccf-d7d47c2c648c\",\n                    \"name\": \"0Одуванчик\"\n                },\n                {\n                    \"id\": \"f08a0297-05c3-42e5-b433-66cd72e72f61\",\n                    \"name\": \"ддддддддддааааа\"\n                }\n            ],\n            \"send_types\": [\n                {\n                    \"key\": \"send_online\",\n                    \"type\": \"send_types\",\n                    \"value\": \"Отобразить в интерфейсе SKIF.PRO\"\n                },\n                {\n                    \"key\": \"send_telegram\",\n                    \"type\": \"send_types\",\n                    \"value\": \"Отправить в Телеграм\"\n                }\n            ],\n            \"roles\": [\n                {\n                    \"key\": \"EDITOR\",\n                    \"value\": \"Редактор\"\n                },\n                {\n                    \"key\": \"ADMIN\",\n                    \"value\": \"Администратор\"\n                }\n            ]\n        }\n    ]\n}\n\n ```",
        "operationId": "newsList",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "offset",
                  "max"
                ],
                "properties": {
                  "offset": {
                    "type": "integer",
                    "example": 0,
                    "description": "Смещение выборки"
                  },
                  "max": {
                    "type": "integer",
                    "example": 20,
                    "description": "Максимальное количество возвращаемых новостей"
                  },
                  "sortField": {
                    "type": "string",
                    "example": "created",
                    "description": "Поле сортировки (по умолчанию created)"
                  },
                  "sortDesc": {
                    "type": "boolean",
                    "example": true,
                    "description": "Сортировка по убыванию даты"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Список системных новостей компании",
            "content": {
              "application/json": {
                "example": {
                  "max_rows": 42,
                  "list": [
                    {
                      "id": "ca212ac7-1cd0-408d-b464-bfe3943d80d8",
                      "created": "2026-09-01 10:00:00",
                      "valid_to": "2026-10-01 00:00:00",
                      "title": "Обновление платформы SKIF 2.0",
                      "message": "Добавлены новые аналитические отчеты и оптимизирована работа с геозонами.",
                      "is_read": false
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/news/{id}/mark_as_read": {
      "put": {
        "tags": [
          "Новости"
        ],
        "summary": "/news/:id/mark_as_read",
        "description": "**Отметить новость, как прочитанную**\n\n---\n\n**Параметры запроса:**\n\nid - идентификатор новости.\n\n---\n\n**Пример запроса:**\n\n``` json\nPUT https://api.skif.pro/api_v1/news/6a742db8-4c06-44bf-9f69-43a8f0f0071d/mark_as_read\n\n ```",
        "operationId": "newsIdMarkAsRead",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID новости для отметки о прочтении",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID новости"
        }
      ]
    },
    "/api_v1/units/sensors/add_to_units": {
      "post": {
        "tags": [
          "Датчики"
        ],
        "summary": "/units/sensors/add_to_units",
        "description": "**Импортирование датчиков**\n\n---\n\nПоля:\n\nunits - выбранные объекты.\n\nsensors - выбранные датчики.\n\nsensor_copy_type - тип импортирования датчиков. Можно получить возможные типы импортирования датчиков из dictionary, где type = sensor_copy_type.\n\n---\n\n**Роль:** Редактор и выше.",
        "operationId": "unitsSensorsAddToUnits",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sensor_copy_type": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "sensor_copy_type_merge"
                      },
                      "type": {
                        "type": "string",
                        "example": "sensor_copy_type"
                      },
                      "value": {
                        "type": "string",
                        "example": "Слияние"
                      }
                    }
                  },
                  "sensors": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "385b68de-6af9-4af7-84c3-a0028b54ef30"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "385b68de-6af9-4af7-84c3-a0028b54ef30"
                      }
                    ]
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "eeb057d5-3653-47d7-a2d4-18af25b51486"
                        }
                      }
                    },
                    "example": [
                      {
                        "id": "eeb057d5-3653-47d7-a2d4-18af25b51486"
                      }
                    ]
                  }
                }
              },
              "examples": {
                "/units/sensors/add_to_units": {
                  "value": {
                    "sensor_copy_type": {
                      "key": "sensor_copy_type_merge",
                      "type": "sensor_copy_type",
                      "value": "Слияние"
                    },
                    "sensors": [
                      {
                        "id": "385b68de-6af9-4af7-84c3-a0028b54ef30"
                      }
                    ],
                    "units": [
                      {
                        "id": "eeb057d5-3653-47d7-a2d4-18af25b51486"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/invoices": {
      "get": {
        "tags": [
          "Счета"
        ],
        "summary": "Получение списка выставленных счетов",
        "description": "**Запрос для получения счетов**\n\n---\n\nДля интеграторов для сотрудников с ролью Редактор тарифа, по которому выдаются все счета, выставленные ранее с колонками Интегратор, Дата, Сумма и ссылка на файл pdf.\n\nДля сотрудника с ролью Контролер доступны для получения все счета, по всем Интеграторам.\n\nДля фильтрации по дате в запросе можно указать from и to. Пример запроса:\n\n> GET /invoices?from=2024-01-01&to=2024-12-31\n\n\n---\n\n**Роль:** Редактор тарифа и выше.\n\n---\n\nПоля в ответе:\n\ndealer - интегратор.\n\ndate - дата в формате yyyy-MM-dd\n\nsum - сумма.\n\nfile_path - ссылка на файл, можно получить файл через ссылку /api_v1/\n\nПример ответа:\n\n```\n[\n    {\n        \"id\": \"b23fc43b-0566-478e-8598-18e83c2b0a92\",\n        \"dealer\": {\n            \"id\": \"f6a2a3fa-930b-4045-8731-3592b466d48f\",\n            \"name\": \"ООО «ТехноЛогистика»\"\n        },\n        \"date\": \"2024-05-01\",\n        \"file_path\": \"/files/dealers_invoice/f6a2a3fa-930b-4045-8731-3592b466d48f/2024-05-01_invoice_7032506.pdf\",\n        \"sum\": 350000\n    },\n    {\n        \"id\": \"21d20961-ad09-4322-abfb-7b34bce74a1e\",\n        \"dealer\": {\n            \"id\": \"f6a2a3fa-930b-4045-8731-3592b466d48f\",\n            \"name\": \"ООО «ТехноЛогистика»\"\n        },\n        \"date\": \"2024-04-01\",\n        \"file_path\": \"/files/dealers_invoice/f6a2a3fa-930b-4045-8731-3592b466d48f/2024-04-01_invoice_2368165.pdf\",\n        \"sum\": 340000\n    }\n]\n\n ```",
        "operationId": "invoices",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "60 req/min",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Начальная дата периода (формат YYYY-MM-DD)",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-01-01"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Конечная дата периода (формат YYYY-MM-DD)",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-12-31"
            }
          }
        ]
      }
    },
    "/api_v1/tools/loadwln": {
      "post": {
        "tags": [
          "Инструменты"
        ],
        "summary": "Служебная утилита парсинга таблиц Wialon по IMEI",
        "description": "**Загрузка истории по объектам**\n\n---\n\nПараметры запроса:\n\ntable - ключ протокола передачи данных объекта (terminal_type_key)\n\nimei - IMEI объекта.\n\n---\n\n**Пример запроса:**\n\nPOST [https://api.skif.pro/api_v1/tools/loadwln?table=navtelecom&amp;imei=85433234354343](https://api.skif.pro/api_v1/tools/loadwln?table=navtelecom&imei=85433234354343)\n\nВ теле запроса для загрузки принимаются только один файл архива в формате zip, в котором находится файл выгрузки истории из Wialon в формате wln.\n\nВ ответе возвращается 200, если загружено успешно или статус для ошибки.\n\nТело ответа содержит текст в формате text/plain.",
        "operationId": "toolsLoadwlnTableTableImeiImei",
        "parameters": [
          {
            "name": "table",
            "in": "query",
            "required": true,
            "description": "Название таблицы",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "imei",
            "in": "query",
            "required": true,
            "description": "IMEI терминала",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {}
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-internal": true,
        "x-min-role": "superadmin",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/tools/exportwln_multiple": {
      "post": {
        "tags": [
          "Выгрузка данных"
        ],
        "summary": "/tools/exportwln_multiple",
        "description": "**Экспортирование множества объектов**\n\n---\n\n**Пример запроса:**\n\nPOST [https://admin-dev.skif.pro/api_v1/tools/exportwln_multiple](https://admin-dev.skif.pro/api_v1/tools/exportwln_multiple)\n\nВозвращает zip файл с необходимыми объектами в формате .wln",
        "operationId": "toolsExportwlnMultiple",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "example": "2024-10-24"
                  },
                  "objects": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "imei": {
                          "type": "string",
                          "example": "862531040000022"
                        },
                        "table": {
                          "type": "string",
                          "example": "novacom"
                        }
                      }
                    },
                    "example": [
                      {
                        "imei": "862531040000022",
                        "table": "novacom"
                      },
                      {
                        "imei": "862531040000021",
                        "table": "novacom"
                      }
                    ]
                  },
                  "to": {
                    "type": "string",
                    "example": "2024-10-25"
                  }
                }
              },
              "examples": {
                "/tools/exportwln_multiple": {
                  "value": {
                    "from": "2024-10-24",
                    "objects": [
                      {
                        "imei": "862531040000022",
                        "table": "novacom"
                      },
                      {
                        "imei": "862531040000021",
                        "table": "novacom"
                      }
                    ],
                    "to": "2024-10-25"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Admin",
        "x-rate-limit": "5 req/min"
      }
    },
    "/api_v1/tools/exportwln": {
      "post": {
        "tags": [
          "Выгрузка данных"
        ],
        "summary": "/tools/exportwln",
        "description": "**Метод для экспортирования объекта**\n\n---\n\nПример:\n\nPOST [https://admin-dev.skif.pro/api_v1/tools/exportwln?table=novacom&amp;imei=123&amp;from=2024-10-24&amp;to=2024-10-25](https://admin-dev.skif.pro/api_v1/tools/exportwln?table=novacom&imei=123&from=2024-10-24&to=2024-10-25)\n\nВозвращает .wln файл с необходимым объектом",
        "operationId": "toolsExportwln",
        "parameters": [
          {
            "name": "table",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "novacom"
            }
          },
          {
            "name": "imei",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "123"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "2024-10-24"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "2024-10-25"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Admin",
        "x-rate-limit": "10 req/min"
      }
    },
    "/api_v1/support_key": {
      "get": {
        "tags": [
          "Support"
        ],
        "summary": "/support_key",
        "description": "Запрос на получение API-ключа для HelpDeskEddy.\n\nВозвращает ответ JSON со статусом 200 или ошибкой в случае ошибки.\n\nПоля ответа:\n\nuser_id - ID пользователя в SKIF.PRO, uuid\n\nhelpdesk_user_id - ID пользователя в HelpDeskEddy\n\nhelpdesk_api_key - API key для HelpDeskEddy\n\nПример ответа:\n\n``` json\n{\n    \"user_id\": \"0179f5d4-a7b0-4bb3-b499-54825ecba753\",\n    \"helpdesk_user_id\": 30,\n    \"helpdesk_api_key\": \"ee914ca2-19dc-4b99-af58-08a9863a1a31\"\n}\n\n ```",
        "operationId": "supportKey",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Supervisor",
        "parameters": []
      }
    },
    "/api_v1/support_hook": {
      "post": {
        "tags": [
          "Support"
        ],
        "summary": "[Webhook] Обработчик входящих событий HelpDeskEddy",
        "description": "для получения webhook запросов от helpdesckeddy. Требуется API key отправить в хедере\n\nПоля JSON запроса:\n\n```\n{\n  \"ticket_id\": \"27\",\n  \"user_id\": \"5\", //id клиента в helpdesck\n  \"ticket_name\": \"Тема обращения\",\n  \"answer\": \"текст ответа\"\n}\n\n ```\n\nПо результату активному пользователю (подключен к нам по websocket) отправляется websocket-сообщение и всегда отправлять push уведомление в следующем формате:\n\n``` json\n{\n    \"thread-id\": \"ID company\",\n    \"alert\": {\n        \"title\": \"Title\",\n        \"body\": \"message\"\n    },\n    \"type\": \"support\",\n    \"ticket_id\": \"27\",\n     \"ticket_name\": \"Тема обращения\",\n     \"answer\": \"текст ответа\"\n}\n\n ```",
        "operationId": "supportHook",
        "requestBody": {
          "content": {
            "application/json": {
              "examples": {
                "/support_hook": {
                  "value": "{\n    \"ticket_id\": \"27\",\n    \"user_id\": \"30\", //id клиента в helpdesck\n    \"ticket_name\": \"Тема обращения\",\n    \"answer\": \"текст ответа\"\n}"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "x-rate-limit": "20 req/min",
        "x-min-role": "Supervisor",
        "x-internal": true,
        "parameters": []
      }
    },
    "/api_v1/users/{id}": {
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "/users",
        "description": "<p><strong>Создание пользователей, минуя приглашение.</strong></p>\n<hr />\n<p>Добавление пользователя с ролью Редактор</p>\n<hr />\n<p><strong>Роль:</strong> Администратор и выше.</p>\n<hr />\n<p><strong>Параметры:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"role\": {\"key\": \"EDITOR\", \"value\": \"Редактор\", \"id\": \"5ac818aa-f66e-4ecd-8981-5bcbafe03255\"}, // Роль выбирается из списка ролей; достаточно указать только идентификатор. Получить все роли GET /roles\n  \"name\": \"Иван Иванов\",     //имя\n  \"password\": \"your_secure_password\",    \n  \"is_driver\": false // является ли пользователь водителем      \n  \"email\": \"user@example.com\", //email\n  \"code\": \"092384\",                //  id пользователя (rfid), доступно для пользоваетля с ролью Editor\n  \"language\" : {\"key\":\"en\"}               //язык пользователя\n  \"phone\" : \"+79990000001\" //телефон пользователя\n  \"details\": \"Просто текстовое поле\"\n  \"telegram_chat_id\": 12345678910, //id-рассылки для Telegram, получается из бота\n    \"units_groups_access\": [{ //Доступ к группам\n            \"units_group\": {\n                \"id\": \"d7bad56b-bb05-4c9c-830b-ed192a3fa4de\"\n            },\n            \"actions\": []//список действий, можно выбирать те actions для которых  is_unit_action = true\nуказанные actions применяются для всех объектов группы\n        },\n        {\n            \"units_group\": {\n                \"id\": \"1769a313-0c20-4ebf-b7f6-7fce00f4f301\"\n            },\n            \"actions\": [{\n                    \"id\": \"051d5caf-b40a-4474-9c25-fb0d83ea4891\",\n                    \"key\": \"delete_unit\"\n                },\n                {\n                    \"id\": \"bc7f985c-9641-4d0a-9f6f-8d5214d98105\",\n                    \"key\": \"update_unit\"\n                }\n            ]\n        }\n    ]\n}\n\n</code></pre><hr />\n<p>Ответ аналогичен PUT /me</p>",
        "operationId": "post_users__id",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID пользователя"
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Admin"
      }
    },
    "/api_v1/map_layers": {
      "get": {
        "tags": [
          "Ресурсы компаний"
        ],
        "summary": "/map_layers",
        "description": "<h3 id=\"получение-списка-всех-слоев-компании\">Получение списка всех слоев компании</h3>\n<p>Возвращает список всех слоев, для текущей активной компании</p>\n<p>Пример ответа</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid\",             // ID базового слоя\n    \"company_layer_id\": \"uuid\", // ID привязки к компании\n    \"name\": \"Название слоя\",\n    \"url\": \"https://...\",\n    \"type\": \"WMS\",\n    \"is_active\": true,        // Включен ли слой по умолчанию\n    \"sort_order\": 0           // Порядок в списке слоев\n  }\n]\n\n</code></pre>",
        "operationId": "get_map_layers",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": []
      },
      "post": {
        "tags": [
          "Ресурсы компаний"
        ],
        "summary": "/map_layers",
        "description": "<h3 id=\"создание-или-редактирование-слоя-в-библиотеке-дилера\">Создание или редактирование слоя в библиотеке дилера</h3>\n<p>Универсальный метод, который выполняет сразу три функции:</p>\n<ol>\n<li><p>Создание нового слоя (если не передан id).</p>\n</li>\n<li><p>Редактирование параметров существующего слоя (если передан id).</p>\n</li>\n<li><p>Управление видимостью слоя: массовая привязка к компаниям и отвязка от них.</p>\n</li>\n</ol>\n<h3 id=\"создание-слоя\">Создание слоя</h3>\n<p>При создании требуется, какому интегратору будет принадлежать слой.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"dealer_id\": \"3d1be96f-6e73-491c-8745-e89e8a46bf94\",\n  \"name\": \"WMS\",\n  \"url\": \"https://test.com/wms\",\n  \"type\": \"WMS\",\n  \"companyIdsToAdd\":[\n    \"c5ca5827-8b23-4f78-9234-276a7a56fe73\",\n    \"e62ae10f-b963-4ca1-87ad-519226231faa\"\n  ]\n}\n\n</code></pre>\n<ul>\n<li><p><strong>dealer_id (обязательно):</strong> UUID интегратора, в список которого добавляется слой.</p>\n</li>\n<li><p><strong>companyIdsToAdd (опционально):</strong> Массив UUID компаний, которым этот слой станет доступен сразу после<br />  создания (по умолчанию он добавится к ним в выключенном состоянии — is_active: false)</p>\n</li>\n</ul>\n<h3 id=\"редактирование-слоя\">Редактирование слоя</h3>\n<p>При редактировании принадлежность к интегратору изменить нельзя.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"15af5b55-f529-485a-9701-b7c9be48f102\",\n  \"name\": \"Новое название карты\",\n  \"url\": \"https://new-url.service.com/wms\",\n  \"companyIdsToAdd\":[\n    \"436aed8b-43c8-4a93-91be-a2cdf2d4d2c2\"\n  ],\n  \"companyIdsToRemove\":[\n    \"c5ca5827-8b23-4f78-9234-276a7a56fe73\"\n  ]\n}\n\n</code></pre>\n<ul>\n<li><p><strong>id (обязательно):</strong> UUID слоя, который нужно изменить. (Если передан, поле dealer_id игнорируется).</p>\n</li>\n<li><p><strong>companyIdsToRemove (опционально):</strong> Массив UUID компаний, у которых этот слой нужно забрать.</p>\n</li>\n</ul>",
        "operationId": "post_map_layers",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator",
        "parameters": []
      }
    },
    "/api_v1/dealer/map_layers": {
      "get": {
        "tags": [
          "Ресурсы компаний"
        ],
        "summary": "/dealer/map_layers",
        "description": "<h3 id=\"получение-списка-всех-слоев-интегратора\">Получение списка всех слоев интегратора</h3>\n<p>Возвращает список слоев карт для интегратора, к которым у пользователя есть доступ.</p>\n<p>Ответ:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid-слоя\",\n    \"name\": \"Кадастр РФ\",\n    \"url\": \"https://...\",\n    \"type\": \"WMS\",\n    \"usage_count\": 2,\n    \"companies\": [\n      {\n        \"id\": \"uuid-компании-1\",\n        \"name\": \"1111\"\n      },\n      {\n        \"id\": \"uuid-компании-2\",\n        \"name\": \"2222'\"\n      }\n    ]\n  }\n]\n\n</code></pre>\n<p>Включает стандартные поля слоя + usage_count (сколько компаний используют слой)</p>",
        "operationId": "get_dealer_map_layers",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader",
        "parameters": []
      }
    },
    "/api_v1/map_layers/{id}": {
      "delete": {
        "tags": [
          "Ресурсы компаний"
        ],
        "summary": "map_layers/:id",
        "description": "<p>Выполняет удаление слоя и все связи этого слоя с компаниями.</p>",
        "operationId": "delete_map_layers__id",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID слоя карты"
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator"
      }
    },
    "/api_v1/company/{id}/map_layers": {
      "get": {
        "tags": [
          "Ресурсы компаний"
        ],
        "summary": "/company/:id/map_layers",
        "description": "<h3 id=\"получение-слоев-конкретной-компании\">Получение слоев конкретной компании</h3>\n<p>Возвращает список слоев, которые были привязаны к указанной компании, с учетом их статуса (активен/неактивен) и порядка сортировки.</p>\n<p>Пример ответа:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid\",             // ID основного слоя\n    \"company_layer_id\": \"uuid\", // ID связи\n    \"name\": \"Карта полей\",\n    \"url\": \"https://...\",\n    \"type\": \"WMS\",\n    \"is_active\": true,        // Включен ли слой у компании\n    \"sort_order\": 0           // Порядок отображения\n  }\n]\n\n</code></pre>\n<p>Сортировка: сначала активные (is_active), затем по sort_order.</p>",
        "operationId": "get_company__id__map_layers",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID компании"
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "60 req/min",
        "x-min-role": "Reader"
      },
      "put": {
        "tags": [
          "Ресурсы компаний"
        ],
        "summary": "/company/:id/map_layers",
        "description": "<h3 id=\"обновление-настроек-слоев-компании\">Обновление настроек слоев компании</h3>\n<p>Позволяет изменить порядок отображения слоев и включить/выключить их для конкретной компании.</p>\n<p>Пример запроса:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid\",         // ID слоя\n    \"is_active\": true     // Статус активности\n  },\n  {\n    \"id\": \"uuid\",\n    \"is_active\": false\n  }\n]\n\n</code></pre>\n<p><strong>Важно:</strong> Порядок объектов в массиве определяет sort_order</p>",
        "operationId": "put_company__id__map_layers",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID компании"
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Operator"
      }
    },
    "/api_v1/geozones/{id}/add_to_groups": {
      "post": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/:id/add_to_groups",
        "description": "<h1 id=\"добавление-геозоны-во-множества-групп\">Добавление геозоны во множества групп</h1>\n<hr />\n<p>В теле запроса укажите требуемые группы геозонов в geozones_groups.</p>\n<p><strong>Роль:</strong> Редактор и выше.</p>\n<hr />\n<p><strong>Пример запроса:</strong></p>\n<p>POST /geozones/efa8cf52-7eb9-426d-a08e-d79f837ac30a/add_to_groups</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"geozones_groups\": [\n        {\"id\": \"036ae8ee-94b3-453e-a25b-0bb4fd8dc119\"},\n        {\"id\": \"d2a01c30-8ed7-4289-a8be-c6054f6fde36\"}\n    ]\n}\n\n</code></pre><hr />",
        "operationId": "post_geozones__id__add_to_groups",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Параметр id"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "geozones": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "geozones": [
                  {
                    "id": "0ca9f774-69fb-4a56-99ae-177f766fc291"
                  },
                  {
                    "id": "8b13e5d3-898a-4463-8f84-0046fc15f323"
                  },
                  {
                    "id": "d507e1ee-3e73-4ee6-a74a-3d1f6b8cbe89"
                  }
                ]
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/geozones/{id}/remove_from_groups": {
      "post": {
        "tags": [
          "Геозоны"
        ],
        "summary": "/geozones/:id/remove_from_groups",
        "description": "<h1 id=\"удаление-геозоны-из-множества-групп\">Удаление геозоны из множества групп</h1>\n<hr />\n<p>В теле запроса укажите требуемые группы геозонов в geozones_groups.</p>\n<p><strong>Роль:</strong> Редактор и выше.</p>\n<hr />\n<p><strong>Пример запроса:</strong></p>\n<p>POST /geozones/efa8cf52-7eb9-426d-a08e-d79f837ac30a/remove_from_groups</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"geozones_groups\": [\n        {\"id\": \"036ae8ee-94b3-453e-a25b-0bb4fd8dc119\"},\n        {\"id\": \"d2a01c30-8ed7-4289-a8be-c6054f6fde36\"}\n    ]\n}\n\n</code></pre><hr />",
        "operationId": "post_geozones__id__remove_from_groups",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Параметр id"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "geozones": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "geozones": [
                  {
                    "id": "0ca9f774-69fb-4a56-99ae-177f766fc291"
                  },
                  {
                    "id": "8b13e5d3-898a-4463-8f84-0046fc15f323"
                  },
                  {
                    "id": "d507e1ee-3e73-4ee6-a74a-3d1f6b8cbe89"
                  }
                ]
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Operator",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/events/bulk": {
      "post": {
        "tags": [
          "События"
        ],
        "summary": "/events/bulk",
        "description": "<h3 id=\"массовое-создание-событий\">Массовое создание событий</h3>\n<hr />\n<p><strong>Параметры:</strong></p>\n<p>Тело запроса должно содержать массив объектов событий.<br /><strong>Общие поля (для каждого объекта в массиве):</strong></p>\n<ul>\n<li><p>\"unit\": {\"id\": \"UUID\"} — (обязательное) ID объекта, для которого создается событие.</p>\n</li>\n<li><p>\"type\": {\"key\": \"string\"} — (обязательное) Ключ типа события. Возможные значения: filling, theft, accident, service, waybill, vehicle_status, random.</p>\n</li>\n<li><p>latitude: Координата широты на карте. Вещественное значение.</p>\n</li>\n<li><p>longitude: Координата долготы на карте. Вещественное значение.</p>\n<ul>\n<li>Примечание: latitude и longitude должны выбираться на стороне клиента для всех типов события, кроме \"путевые листы\" при смене даты с помощью метода POST /point.</li>\n</ul>\n</li>\n</ul>\n<p><strong>Остальные поля зависят от типа события (для каждого объекта в массиве):</strong></p>\n<p><strong>1) Заправка</strong> — type.key=filling</p>\n<ul>\n<li><p>\"datetime\": \"2020-01-01 12:30:00\" (обязательное) — дата и время события.</p>\n</li>\n<li><p>\"deviation_minutes\": 100 (обязательное) — Отклонение, мин. Числовое поле от 0 до 1000.</p>\n</li>\n<li><p>\"filled\": 30.5 (обязательное) — Заправлено топлива, л. Числовое поле больше 0.</p>\n</li>\n<li><p>\"price\": 3050.7 (необязательное) — Стоимость. Числовое поле от 0.</p>\n</li>\n<li><p>\"description\": \"some details\" (необязательное) — Описание. Текстовое поле.</p>\n</li>\n</ul>\n<p><strong>2) Слив</strong> — type.key=theft</p>\n<ul>\n<li><p>\"datetime\": \"2020-01-01 12:30:00\" (обязательное).</p>\n</li>\n<li><p>\"deviation_minutes\": 100 (обязательное).</p>\n</li>\n<li><p>\"stolen\": 20.8 (обязательное) — Слито топлива, л.</p>\n</li>\n<li><p>\"description\": \"some details\" (необязательное).</p>\n</li>\n</ul>\n<p><strong>3) ДТП</strong> — type.key=accident</p>\n<ul>\n<li><p>\"datetime\": \"2020-01-01 12:30:00\" (обязательное).</p>\n</li>\n<li><p>\"deviation_minutes\": 100 (обязательное).</p>\n</li>\n<li><p>\"description\": \"some details\" (необязательное).</p>\n</li>\n</ul>\n<p><strong>4) Тех. обслуживание</strong> — type.key=service</p>\n<ul>\n<li><p>\"datetime\": \"2020-01-01 12:30:00\" (обязательное).</p>\n</li>\n<li><p>\"deviation_minutes\": 100 (обязательное).</p>\n</li>\n<li><p>\"service_name\": \"Установка ДУТ\" (обязательное) — Название сервиса.</p>\n</li>\n<li><p>\"motohours\": 2345.5 (необязательное) — Моточасы, ч.</p>\n</li>\n<li><p>\"millage\": 23453.5 (необязательное) — Пробег, км.</p>\n</li>\n<li><p>\"duration_hours\": 3.5 (необязательное) — Длительность, ч.</p>\n</li>\n<li><p>\"price\": 3000.4 (необязательное) — Стоимость.</p>\n</li>\n<li><p>\"guaranteed\": true (обязательное) — Гарантийный: true/false.</p>\n</li>\n<li><p>\"description\": \"some details\" (необязательное).</p>\n</li>\n</ul>\n<p><strong>5) Путевой лист</strong> — type.key=waybill</p>\n<ul>\n<li><p>\"start_date\": \"2020-01-03 12:30:00\" (обязательное) — Начало: дата и время.</p>\n</li>\n<li><p>\"finish_date\": \"2020-01-05 18:00:00\" (обязательное) — Окончание: дата и время.</p>\n</li>\n<li><p>\"user_id\": ID Водителя (необязательное).</p>\n</li>\n<li><p>\"motohours\": 2345.5 (необязательное).</p>\n</li>\n<li><p>\"millage\": 23453.5 (необязательное).</p>\n</li>\n<li><p>\"filled\": 30.5 (необязательное).</p>\n</li>\n</ul>\n<p><strong>6) Статус ТС</strong> — type.key=vehicle_status</p>\n<ul>\n<li><p>\"datetime\": \"2020-01-01 12:30:00\" (обязательное).</p>\n</li>\n<li><p>\"type_name\": \"В гараже\" (обязательное) — Тип события, текстовое поле.</p>\n</li>\n<li><p>\"description\": \"some details\" (необязательное).</p>\n</li>\n</ul>\n<p><strong>7) Произвольное событие</strong> — type.key=random</p>\n<ul>\n<li><p>\"datetime\": \"2020-01-01 12:30:00\" (обязательное).</p>\n</li>\n<li><p>\"deviation_minutes\": 100 (обязательное).</p>\n</li>\n<li><p>\"type_name\": \"Повышение скорости\" (обязательное) — Тип события, текстовое поле.</p>\n</li>\n<li><p>\"description\": \"some details\" (необязательное).</p>\n</li>\n</ul>\n<p><strong>Роль:</strong> Оператор и выше.</p>\n<p><strong>Важно:</strong><br />Операция выполняется в одной транзакции. Если хотя бы одно событие в<br />списке не пройдет валидацию (или у пользователя нет доступа к указанному<br />объекту), ни одно событие не будет создано.</p>\n<hr />\n<p><strong>Пример запроса:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"unit\": {\n      \"id\": \"7547dfbc-4e2f-46a2-9f24-8e61a5cc646c\"\n    },\n    \"type\": {\n      \"key\": \"filling\"\n    },\n    \"datetime\": \"2026-01-15 15:18:10\",\n    \"deviation_minutes\": 23,\n    \"filled\": 232,\n    \"price\": 23,\n    \"description\": \"Заправка на трассе\",\n    \"latitude\": 53.13996,\n    \"longitude\": 26.06976\n  },\n  {\n    \"unit\": {\n      \"id\": \"f449dd65-412f-4e79-83a8-838d8f5dcab7\"\n    },\n    \"type\": {\n      \"key\": \"accident\"\n    },\n    \"datetime\": \"2026-01-15 15:20:10\",\n    \"deviation_minutes\": 32,\n    \"description\": \"ДТП\",\n    \"latitude\": 53.95149,\n    \"longitude\": 27.70800\n  }\n]\n\n</code></pre>\n<p><strong>Пример ответа:</strong></p>\n<p>Возвращается массив созданных событий.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"id\": \"49bac727-0d5b-4e18-b71b-155437fe17a6\",\n        \"company_id\": \"5ed16b37-23a4-4f03-806e-5e175f08c9a9\",\n        \"unit\": {\n            \"id\": \"7547dfbc-4e2f-46a2-9f24-8e61a5cc646c\",\n            \"name\": \"unit name\"\n        },\n        \"type\": {\n            \"key\": \"filling\",\n            \"type\": null,\n            \"value\": null\n        },\n        \"datetime\": \"2026-01-15 18:47:43\",\n        \"deviation_minutes\": 123,\n        \"filled\": 123.0,\n        \"price\": 123.0,\n        \"description\": \"123\",\n        \"latitude\": 41.862531040000024,\n        \"longitude\": 44.862531040000023,\n        \"photos\": []\n    },\n    ...\n]\n\n</code></pre>\n<hr />\n<p><strong>Работа с фотографиями:</strong></p>\n<p>К событиям в массовом запросе также можно добавлять фотографии. Логика аналогична методу /create.</p>\n<ol>\n<li><p>Фотографии загружаются заранее через POST {{base_url}}/upload_photos/events.</p>\n</li>\n<li><p>Полученный JSON с small и original добавляется в массив photos нужного объекта события внутри общего списка.</p>\n</li>\n</ol>\n<p><strong>Пример части запроса с фото:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"unit\": { \"id\": \"...\" },\n    \"type\": { \"key\": \"filling\" },\n    ...\n    \"photos\": [\n        {\n            \"small\": {\n                \"url\": \"/photos/events/fa3357f6..._300.png\",\n                \"width\": 251,\n                \"height\": 300,\n                \"param_type\": \"events\"\n            },\n            \"original\": {\n                \"url\": \"/photos/events/fa3357f6..._original.png\",\n                \"width\": 628,\n                \"height\": 749,\n                \"param_type\": \"events\"\n            }\n        }\n    ]\n  },\n  {\n    \"unit\": { \"id\": \"...\" },\n    ...\n  }\n]\n\n</code></pre>",
        "operationId": "post_events_bulk",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "unit": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        }
                      }
                    },
                    "datetime": {
                      "type": "string"
                    },
                    "type": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string"
                        }
                      }
                    },
                    "deviation_minutes": {
                      "type": "integer"
                    },
                    "filled": {
                      "type": "number"
                    }
                  }
                }
              },
              "example": [
                {
                  "unit": {
                    "id": "58acca5a-1f17-4418-9143-3e4c8a320f3a"
                  },
                  "datetime": "2020-01-02 12:30:00",
                  "type": {
                    "key": "filling"
                  },
                  "deviation_minutes": 20,
                  "filled": 101.5
                }
              ]
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Operator",
        "x-rate-limit": "20 req/min"
      }
    },
    "/api_v1/monitoring_basic": {
      "post": {
        "tags": [
          "Мониторинг"
        ],
        "summary": "Базовая сводка мониторинга по объектам",
        "description": "Возвращает суммарный суточный пробег, количество заправок и сливов для выбранных объектов (до 100 объектов).",
        "operationId": "post_monitoring_basic",
        "responses": {
          "200": {
            "description": "Сводка мониторинга за сутки",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "sum_distance": {
                      "type": "number",
                      "example": 142.5
                    },
                    "cnt_stucked_fillings": {
                      "type": "integer",
                      "example": 2
                    },
                    "cnt_drained_fillings": {
                      "type": "integer",
                      "example": 0
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "requestBody": {
          "description": "Список объектов для мониторинга",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "units"
                ],
                "properties": {
                  "units": {
                    "type": "array",
                    "description": "Массив объектов (до 100)",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/point/batch": {
      "post": {
        "tags": [
          "Треки"
        ],
        "summary": "/point/batch",
        "description": "<p><strong>Получение краткой информации (аннотации) о конкретной/последней точке для нескольк объектов</strong></p>\n<hr />\n<p>Параметр \"from\" должен быть равен или быть максимально приближен к искомой точке. Если данный параметр отсутствует, то возвращается последняя точка объекта.</p>\n<p>Пример запроса:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n   \"units\":[\n      {\n            \"id\": \"eb74af80-32eb-48a5-aea4-00ed26fa1d21\"\n      },\n     {\n            \"id\": \"d8497f29-5eb8-4810-9931-3f1ac05aeef4\"\n     }\n   ]\n}\n\n</code></pre>\n<p>Ответ возвращает массив JSON, каждый элемент которого представляет собой аннотацию об объекте.</p>\n<p>Пример ответа:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"columns\": [\n            {\n                \"key\": \"unit_name\",\n                \"name\": \"Имя\",\n                \"value\": \"Урал АТЗ (А123АА777)\",\n                \"group\": \"main\"\n            }\n        ]\n    },\n    {\n        \"columns\": [\n            {\n                \"key\": \"unit_name\",\n                \"name\": \"Имя\",\n                \"value\": \"КамАЗ 5490\",\n                \"group\": \"main\"\n            },\n            {\n                \"key\": \"datepoint\",\n                \"name\": \"Дата и время\",\n                \"value\": \"2024-10-15 05:17:56\",\n                \"group\": \"main\"\n            },\n            {\n                \"key\": \"_datepoint\",\n                \"name\": \"_datepoint\",\n                \"value\": \"2024-10-15 05:17:56\",\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"_unix_timestamp\",\n                \"name\": \"_unix_timestamp\",\n                \"value\": 1728958676,\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"speed\",\n                \"name\": \"Скорость\",\n                \"value\": 128,\n                \"group\": \"gps\"\n            },\n            {\n                \"key\": \"satellites\",\n                \"name\": \"Спутники\",\n                \"value\": 18,\n                \"group\": \"gps\"\n            },\n            {\n                \"key\": \"_angle\",\n                \"name\": \"Угол\",\n                \"value\": 0,\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"address\",\n                \"name\": \"Адрес\",\n                \"value\": \"52.888 83.4898\",\n                \"group\": \"gps\"\n            },\n            {\n                \"key\": \"_imei\",\n                \"name\": \"imei\",\n                \"value\": \"862531040000020\",\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"_sim1\",\n                \"name\": \"sim1\",\n                \"value\": \"+79990000001\",\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"_sim2\",\n                \"name\": \"sim2\",\n                \"value\": \"+79990000002\",\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"_marker_latlon\",\n                \"name\": \"_marker_latlon\",\n                \"value\": [\n                    52.887977600097656,\n                    83.48977661132812\n                ],\n                \"group\": \"hidden\"\n            },\n            {\n                \"key\": \"0b7185cf-f594-4ed8-aef1-35457ea5debe\",\n                \"name\": \"ДУТ-1\",\n                \"type\": \"fuelsensor\",\n                \"value\": 153.34,\n                \"group\": \"sensors\"\n            },\n            {\n                \"key\": \"b78689f9-e433-4a19-8dd7-653a56636f2a\",\n                \"name\": \"Зажигание\",\n                \"type\": \"ignition\",\n                \"value\": \"Выкл\",\n                \"group\": \"sensors\",\n                \"_value\": 0\n            },\n            {\n                \"key\": \"9b722af0-4fb2-458e-a47e-56fb38a52ae2\",\n                \"name\": \"ДУТ-2\",\n                \"type\": \"fuelsensor\",\n                \"value\": 0,\n                \"group\": \"sensors\"\n            },\n            {\n                \"key\": \"78e0a8e1-b293-4cd7-b8fb-1ec9fb4827b3\",\n                \"name\": \"Пробег\",\n                \"type\": \"mileage\",\n                \"value\": 435243.34,\n                \"group\": \"sensors\"\n            }\n        ]\n    }\n]\n\n</code></pre>",
        "operationId": "post_point_batch",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string"
                  },
                  "units": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "from": "2020-04-07 07:41:35",
                "units": [
                  {
                    "id": "31e92253-1e70-4bb2-9b6f-385e9eed9ba4"
                  }
                ]
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "x-min-role": "Observer",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/retranslator_histories_bulk": {
      "post": {
        "tags": [
          "Ретрансляция исторических данных"
        ],
        "summary": "Пакетный запуск исторической ретрансляции",
        "description": "<p><strong>Массовое добавление ретрансляции исторических данных</strong></p>\n<hr />\n<p>Поля в JSON:</p>\n<p>imei - IMEI объекта</p>\n<p>terminal_type - ключ типа протокола объекта.</p>\n<p>name - имя объекта.</p>\n<p>comment - комментарий.</p>\n<p>retrans_from - период ретрансляции от в формате yyyy-MM-dd HH:mm:ss</p>\n<p>retrans_to - период ретрансляции до.</p>\n<hr />\n<p><strong>Роль:</strong> Супервизор и выше.</p>\n<hr />\n<p><strong>Пример запроса:</strong></p>\n<p>POST <a href=\"https://app.skif.pro/api_v1/retranslator_histories_bulk\">https://app.skif.pro/api_v1/retranslator_histories_bulk</a></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n{\n    \"imei\": \"12346789\",\n    \"terminal_type\": \"navtelecom\",\n    \"name\": \"Ретранслятор 1\",\n    \"unit_name\": \"Объект\",\n    \"comment\": \"Комментарий 1\",\n    \"retrans_from\": \"2023-01-01 00:00:00\",\n    \"retrans_to\": \"2023-01-02 00:00:30\"\n},\n{\n    \"imei\": \"12346789\",\n    \"terminal_type\": \"navtelecom\",\n    \"name\": \"Ретранслятор 2\",\n    \"unit_name\": \"Объект\",\n    \"comment\": \"Комментарий 2\",\n    \"retrans_from\": \"2025-01-01 00:00:00\",\n    \"retrans_to\": \"2025-01-02 00:00:30\"\n}\n]\n\n</code></pre>\n<hr />\n<p><strong>Пример ответа:</strong></p>\n<p>Если запрос успешен, тогда возвращается соозданная запись, иначе ошибка.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n{\n    \"id\": \"435aa261-d06a-422b-b64c-1ee94b447c9e\",\n    \"imei\": \"12346789\",\n    \"terminal_type\": \"navtelecom\",\n    \"name\": \"Ретранслятор 1\",\n    \"unit_name\": \"Объект\",\n    \"comment\": \"Комментарий 1\",\n    \"retrans_from\": \"2023-01-01 00:00:00\",\n    \"retrans_to\": \"2023-01-02 00:00:30\"\n    \"status\": \"WAITING\"\n},\n{\n    \"imei\": \"12346789\",\n    \"terminal_type\": \"navtelecom\",\n    \"name\": \"Ретранслятор 2\",\n    \"unit_name\": \"Объект\",\n    \"comment\": \"Комментарий 2\",\n    \"retrans_from\": \"2025-01-01 00:00:00\",\n    \"retrans_to\": \"2025-01-02 00:00:30\"\n    \"status\": \"WAITING\"\n}\n]\n\n</code></pre>",
        "operationId": "post_retranslator_histories_bulk",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "20 req/min",
        "parameters": []
      }
    },
    "/api_v1/export_templates": {
      "post": {
        "tags": [
          "Agro"
        ],
        "summary": "Создание шаблона экспорта полей и геозон агромодуля",
        "description": "Настройка структуры полей и слоев геометрии для выгрузки контуров полей в сторонние агросистемы.",
        "operationId": "post_export_templates",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "30 req/min",
        "parameters": []
      }
    },
    "/api_v1/export_templates/{id}": {
      "put": {
        "tags": [
          "Agro"
        ],
        "summary": "Обновление шаблона экспорта агромодуля",
        "description": "Редактирование полей и правил форматирования выгрузки агро-данных.",
        "operationId": "put_export_templates__id",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID шаблона экспорта",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "30 req/min"
      },
      "delete": {
        "tags": [
          "Agro"
        ],
        "summary": "Удаление шаблона экспорта агромодуля",
        "description": "Удаление конфигурации шаблона выгрузки.",
        "operationId": "delete_export_templates__id",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID шаблона экспорта",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/export_templates/list": {
      "post": {
        "tags": [
          "Agro"
        ],
        "summary": "Получение списка шаблонов экспорта агромодуля",
        "description": "Реестр сохраненных шаблонов экспорта агро-геометрии и атрибутов культур.",
        "operationId": "post_export_templates_list",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/agro_hidden_intervals": {
      "post": {
        "tags": [
          "Agro"
        ],
        "summary": "Создание скрытого интервала агро-обработки",
        "description": "Исключение интервала времени работы сельхозтехники из расчетов обработанной площади полей.",
        "operationId": "post_agro_hidden_intervals",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "30 req/min",
        "parameters": []
      }
    },
    "/api_v1/agro/hidden_intervals/list": {
      "post": {
        "tags": [
          "Agro"
        ],
        "summary": "Получение списка скрытых интервалов агро-обработки",
        "description": "Реестр интервалов времени, исключенных из расчетов полевых работ (перегоны, сервисные паузы, холостой ход).",
        "operationId": "post_agro_hidden_intervals_list",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "integer",
                    "example": 0
                  },
                  "count": {
                    "type": "integer",
                    "example": 20
                  },
                  "unit_id": {
                    "type": "string",
                    "format": "uuid"
                  }
                }
              }
            }
          }
        },
        "parameters": []
      }
    },
    "/api_v1/agro/hidden_intervals/{id}": {
      "delete": {
        "tags": [
          "Agro"
        ],
        "summary": "Удаление скрытого интервала агро-обработки",
        "description": "Удаление исключенного интервала с возвратом отрезка в расчет агро-отчетов.",
        "operationId": "delete_agro_hidden_intervals__id",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID скрытого интервала",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "30 req/min"
      }
    },
    "/api_v1/admin_export": {
      "post": {
        "tags": [
          "Экспорт сущностей"
        ],
        "summary": "/admin_export",
        "description": "<p><strong>Запуск экспорта сущностей в файл</strong></p>\n<hr />\n<p>Ставит в очередь выгрузку выбранных сущностей компаний в JSON (одна сущность) или ZIP из JSON-файлов (несколько сущностей). Используется на экране «Инструменты» админки.</p>\n<p>Метод не ждёт окончания выгрузки: сразу возвращает <code>job_id</code>, а ход и результат нужно запрашивать через <code>GET /admin_export/status/:jobId</code>. Ошибки в теле запроса (нет <code>entities</code>, нет доступных компаний и т. п.) тоже приходят не здесь, а в статусе задачи со <code>status: \"error\"</code>.</p>\n<p>В выгрузку попадает не больше 20 000 записей каждого типа. Файл хранится 30 минут, потом удаляется.</p>\n<hr />\n<p><strong>Роль:</strong> Администратор и выше. Работает только под ролью по умолчанию: если пользователь переключился на другую роль, задача завершится ошибкой доступа.</p>\n<hr />\n<p><strong>Параметры:</strong></p>\n<ul>\n<li>entities: object - какие сущности выгружать. Обязательно, минимум один ключ. Ключ — тип сущности, значение — условия выборки. Возможные ключи: <code>units</code>, <code>units_groups</code>, <code>geozones</code>, <code>geozones_groups</code>, <code>routes</code>, <code>trips</code>, <code>notifications</code>, <code>report_templates</code>, <code>units_drivers</code>, <code>trailers</code>.<ul>\n<li>ids: array of string (UUID) - идентификаторы сущностей этого типа. Необязательно. Если не передан и <code>all</code> не равен <code>true</code>, этот тип не выгружается.</li>\n<li>all: boolean - выгрузить все сущности этого типа в доступных компаниях. Необязательно, по умолчанию <code>false</code>. При <code>true</code> поле <code>ids</code> не учитывается.</li>\n<li>filter: object - сужает выборку при <code>all: true</code>, в том же формате, что и <code>POST /admin_query</code>. Необязательно. Без <code>all: true</code> не учитывается.<ul>\n<li>field: string - поле для поиска. Необязательно. Должно входить в поля поиска модели, иначе тип попадёт в <code>summary.errors</code> с причиной <code>invalid_filter_field</code>.</li>\n<li>value: string - искомое значение. Необязательно. Поиск по вхождению без учёта регистра.</li>\n<li>exact_match: boolean - искать точное совпадение вместо вхождения. Необязательно, по умолчанию <code>false</code>.</li>\n<li>conditions: array - дополнительные фильтры «значение из списка». Необязательно.<ul>\n<li>field: string - поле. Обязательно для элемента. Должно входить в поля поиска модели.</li>\n<li>values: array of string - допустимые значения. Необязательно, если указан <code>value</code>.</li>\n<li>value: string - одно допустимое значение. Используется, если <code>values</code> пустой.</li>\n</ul>\n</li>\n<li>companies: array - сужает список компаний для этого типа. Необязательно. Компании вне общего доступного списка не учитываются.<ul>\n<li>id: string (UUID) - идентификатор компании.</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>include_related: boolean - дополнительно выгрузить связанные сущности. Необязательно, по умолчанию <code>false</code>. Связи раскрываются на один уровень: группы объектов → объекты, группы геозон → геозоны, уведомления → объекты, группы объектов, геозоны и их группы, водители → объекты, шаблоны отчётов → геозоны и группы геозон, прицепы → объекты. К объекту (<code>units</code>) связанные сущности не подтягиваются.</li>\n<li>companies: array - из каких компаний выгружать. Необязательно. Берётся пересечение с компаниями пользователя; если поле не передано, выгрузка идёт по всем компаниям пользователя. Если пересечение пустое, задача завершится ошибкой «Компании не найдены».<ul>\n<li>id: string (UUID) - идентификатор компании. Обязательно для элемента.</li>\n</ul>\n</li>\n</ul>\n<p>Если среди <code>ids</code> есть сущности, которых нет или к которым нет доступа, выгрузка не падает: они перечисляются в <code>summary.errors</code> с причиной <code>not_found_or_no_access</code>.</p>\n<hr />\n<p><strong>Пример запроса:</strong>\nДва объекта по идентификаторам и все геозоны с «склад» в названии из одной компании, вместе со связанными сущностями.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"entities\": {\n    \"units\": {\"ids\": [\"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"b23456c3-7890-2bc3-4de5-2bc345de6f78\"]},\n    \"geozones\": {\"all\": true, \"filter\": {\"field\": \"name\", \"value\": \"склад\"}}\n  },\n  \"include_related\": true,\n  \"companies\": [{\"id\": \"c34567d4-8901-3cd4-5ef6-3cd456ef7a89\"}]\n}\n</code></pre><hr />\n<p><strong>Ответ:</strong>\nКод 200. Задача поставлена в очередь, дальше её статус запрашивается по <code>job_id</code>.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\"\n}\n</code></pre>",
        "operationId": "post_admin_export",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "entities": {
                    "type": "object",
                    "properties": {
                      "units": {
                        "type": "object",
                        "properties": {
                          "ids": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        }
                      },
                      "geozones": {
                        "type": "object",
                        "properties": {
                          "all": {
                            "type": "boolean"
                          },
                          "filter": {
                            "type": "object",
                            "properties": {
                              "field": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "include_related": {
                    "type": "boolean"
                  },
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "entities": {
                  "units": {
                    "ids": [
                      "a12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                      "b23456c3-7890-2bc3-4de5-2bc345de6f78"
                    ]
                  },
                  "geozones": {
                    "all": true,
                    "filter": {
                      "field": "name",
                      "value": "склад"
                    }
                  }
                },
                "include_related": true,
                "companies": [
                  {
                    "id": "c34567d4-8901-3cd4-5ef6-3cd456ef7a89"
                  }
                ]
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "parameters": []
      }
    },
    "/api_v1/admin_export/jobs": {
      "get": {
        "tags": [
          "Экспорт сущностей"
        ],
        "summary": "/admin_export/jobs",
        "description": "<p><strong>Получение списка задач экспорта пользователя</strong></p>\n<hr />\n<p>Возвращает задачи экспорта текущего пользователя в любом статусе, новые первыми. Нужен, чтобы после перезагрузки страницы вернуться к незавершённым выгрузкам. Задача пропадает из списка через 30 минут после завершения.</p>\n<hr />\n<p><strong>Роль:</strong> Администратор и выше, только под ролью по умолчанию.</p>\n<hr />\n<p><strong>Параметры:</strong> нет.</p>\n<hr />\n<p><strong>Ответ:</strong><br />Код 200. Массив задач, формат элемента — как в ответе <code>GET /admin_export/status/:jobId</code>. Если задач нет, приходит пустой массив <code>[]</code>.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>[\n  {\n    \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n    \"status\": \"running\",\n    \"created_at\": \"2026-09-23T09:15:02.418Z\",\n    \"percent\": 40\n  },\n  {\n    \"job_id\": \"e56789f6-0123-5ef6-7ab8-5ef678ab9c01\",\n    \"status\": \"done\",\n    \"created_at\": \"2026-09-23T09:02:47.105Z\",\n    \"summary\": {\"total\": 1, \"by_type\": {\"units\": 1}, \"errors\": []},\n    \"filename\": \"units_a12345b2-6789-1ab2-3cd4-1ab234cd5e67.json\",\n    \"download_path\": \"/api_v1/files/exports_entites/f67890a7-1234-6fa7-8bc9-6fa789bc0d12.json\"\n  }\n]\n\n</code></pre><p>Код 403, если роль не подходит или активна не роль по умолчанию:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"error\": \"no_access\"\n}\n\n</code></pre>",
        "operationId": "get_admin_export_jobs",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/admin_export/status/{jobId}": {
      "get": {
        "tags": [
          "Экспорт сущностей"
        ],
        "summary": "/admin_export/status/:jobId",
        "description": "<p><strong>Получение статуса задачи экспорта</strong></p>\n<hr />\n<p>Возвращает ход выполнения и результат задачи. Клиент опрашивает метод, пока <code>status</code> не станет <code>done</code> или <code>error</code>.</p>\n<hr />\n<p><strong>Роль:</strong> Администратор и выше, только под ролью по умолчанию.</p>\n<hr />\n<p><strong>Параметры:</strong></p>\n<ul>\n<li>jobId: string (UUID) - идентификатор задачи из ответа <code>POST /admin_export</code>. Обязательно, передаётся в пути.</li>\n</ul>\n<hr />\n<p><strong>Ответ:</strong><br />Поля ответа:</p>\n<ul>\n<li>job_id: string (UUID) - идентификатор задачи.</li>\n<li>status: string - <code>waiting</code> — в очереди, <code>running</code> — выполняется, <code>done</code> — готово, <code>error</code> — ошибка.</li>\n<li>created_at: string - время создания задачи, ISO 8601, UTC.</li>\n<li>percent: number - прогресс от 0 до 100. Есть только при <code>running</code>: 0–40 — выборка записей, 40–100 — запись файла.</li>\n<li>summary: object - итог выгрузки. Есть только при <code>done</code>.<ul>\n<li>total: number - сколько сущностей выгружено.</li>\n<li>by_type: object - сколько сущностей каждого типа.</li>\n<li>errors: array - что не удалось выгрузить. <code>type</code> — тип сущности, <code>id</code> или <code>field</code> — сущность или поле фильтра, <code>reason</code>: <code>unknown_entity_type</code> — неизвестный тип, <code>not_found_or_no_access</code> — сущность не найдена или нет доступа, <code>invalid_filter_field</code> — по полю нельзя фильтровать, <code>record_limit_exceeded</code> — превышен лимит 20 000 записей для выборки по <code>ids</code> (при <code>all: true</code> лишнее отсекается без ошибки).</li>\n</ul>\n</li>\n<li>filename: string - имя файла для сохранения. Есть при <code>done</code>, если выгружена хотя бы одна сущность. Одна сущность — <code><тип>_.json</code>, несколько — <code>skif_export_.zip</code>, внутри архива файлы <code><тип>/<тип>_.json</code>.</li>\n<li>download_path: string - путь для скачивания файла, отдаётся nginx на том же домене. Есть там же, где <code>filename</code>. Файл хранится 30 минут.</li>\n<li>error: object - есть только при <code>error</code>.<ul>\n<li>code: number - всегда <code>4220</code>.</li>\n<li>message: string - текст ошибки на языке пользователя.</li>\n</ul>\n</li>\n</ul>\n<p>Код 200, выполняется:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n  \"status\": \"running\",\n  \"created_at\": \"2026-09-23T09:15:02.418Z\",\n  \"percent\": 65\n}\n\n</code></pre><p>Код 200, готово:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n  \"status\": \"done\",\n  \"created_at\": \"2026-09-23T09:15:02.418Z\",\n  \"summary\": {\n    \"total\": 14,\n    \"by_type\": {\"units\": 2, \"geozones\": 12},\n    \"errors\": [\n      {\"type\": \"units\", \"id\": \"b23456c3-7890-2bc3-4de5-2bc345de6f78\", \"reason\": \"not_found_or_no_access\"}\n    ]\n  },\n  \"filename\": \"skif_export_a78901b8-2345-7ab8-9cd0-7ab890cd1e23.zip\",\n  \"download_path\": \"/api_v1/files/exports_entites/b89012c9-3456-8bc9-0de1-8bc901de2f34.zip\"\n}\n\n</code></pre><p>Если ничего не выгрузилось, при <code>done</code> приходит только <code>summary</code> с <code>total: 0</code>, а <code>filename</code> и <code>download_path</code> отсутствуют.</p>\n<p>Код 200, ошибка:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n  \"status\": \"error\",\n  \"created_at\": \"2026-09-23T09:15:02.418Z\",\n  \"error\": {\n    \"code\": 4220,\n    \"message\": \"Компании не найдены\"\n  }\n}\n\n</code></pre><p>Возможные сообщения ошибки: «У Вас недостаточно прав для этого действия», «Не валидный параметр» (тело запроса не разобралось), «Неверное значение параметра entities», «Компании не найдены», «Внутренняя ошибка сервера, обратитесь к администратору».</p>\n<p>Код 403, если роль не подходит или активна не роль по умолчанию:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"error\": \"no_access\"\n}\n\n</code></pre><p>Код 404, если задачи нет: неверный <code>jobId</code> или прошло больше 30 минут после завершения.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"error\": \"job_not_found\"\n}\n\n</code></pre><p>Код 400, если <code>jobId</code> не является UUID.</p>",
        "operationId": "get_admin_export_status__jobId",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Параметр jobId"
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/auth_admin_export": {
      "post": {
        "tags": [
          "Экспорт сущностей"
        ],
        "summary": "/auth_admin_export",
        "description": "<p><strong>Запуск экспорта пользователей и водителей в файл</strong></p>\n<hr />\n<p>Ставит в очередь выгрузку пользователей и водителей компаний в JSON (одна запись) или ZIP из JSON-файлов (несколько записей). Остальные сущности (объекты, геозоны и т. д.) выгружаются методом <code>POST /admin_export</code>. Формат запроса, задачи и результата у методов одинаковый.</p>\n<p>Метод не ждёт окончания выгрузки: сразу возвращает <code>job_id</code>, а ход и результат нужно запрашивать через <code>GET /auth_admin_export/status/:jobId</code>. Ошибки в содержимом запроса (нет <code>entities</code>, нет доступных компаний и т. п.) приходят не здесь, а в статусе задачи со <code>status: \"error\"</code>.</p>\n<p>Выгружаются только пользователи с ролью в компании не выше Администратора. Сотрудники интегратора (Супервайзер, Тарифный редактор, Контролёр) в выгрузку не попадают. В выгрузке нет пароля и настроек VPN, а в <code>companies</code> у пользователя перечислены только компании, доступные для выгрузки.</p>\n<p>В выгрузку попадает не больше 20 000 записей каждого типа. Файл хранится 30 минут, потом удаляется.</p>\n<hr />\n<p><strong>Роль:</strong> Администратор и выше.</p>\n<hr />\n<p><strong>Параметры:</strong></p>\n<ul>\n<li>entities: object - кого выгружать. Обязательно, минимум один ключ. Ключ — тип сущности, значение — условия выборки. Возможные ключи: <code>users</code> — пользователи, <code>drivers</code> — водители.<ul>\n<li>ids: array of string (UUID) - идентификаторы пользователей или водителей. Необязательно. Если не передан и <code>all</code> не равен <code>true</code>, этот тип не выгружается.</li>\n<li>all: boolean - выгрузить всех пользователей или водителей в доступных компаниях. Необязательно, по умолчанию <code>false</code>. При <code>true</code> поле <code>ids</code> не учитывается.</li>\n<li>filter: object - сужает выборку при <code>all: true</code>, так же, как поиск пользователей в <code>POST /auth_admin_query</code>. Необязательно. Без <code>all: true</code> не учитывается.<ul>\n<li>field: string - поле для поиска. Необязательно. Возможные значения: <code>name</code>, <code>code</code>, <code>telegram_chat_id</code>, <code>email</code>, <code>phone</code>. Если не передано, <code>value</code> ищется по всем этим полям сразу и по точному совпадению с <code>id</code>. С другим значением тип попадёт в <code>summary.errors</code> с причиной <code>invalid_filter_field</code>.</li>\n<li>value: string - искомое значение. Необязательно. Поиск по вхождению без учёта регистра.</li>\n<li>exact_match: boolean - искать точное совпадение вместо вхождения. Необязательно, по умолчанию <code>false</code>.</li>\n<li>conditions: array - дополнительные фильтры «значение из списка». Необязательно.<ul>\n<li>field: string - поле. Обязательно для элемента. Возможное значение: только <code>role_key</code> — роль пользователя в компании. С другим значением тип попадёт в <code>summary.errors</code> с причиной <code>invalid_filter_field</code>.</li>\n<li>values: array of string - допустимые ключи ролей. Необязательно, если указан <code>value</code>. Возможные значения: <code>ADMIN</code>, <code>EDITOR</code>, <code>OPERATOR</code>, <code>READER</code>, <code>OBSERVER</code>, <code>NO_ACCESS</code>.</li>\n<li>value: string - один допустимый ключ роли. Используется, если <code>values</code> пустой.</li>\n</ul>\n</li>\n<li>companies: array - сужает список компаний для этого типа. Необязательно. Компании вне общего доступного списка не учитываются.<ul>\n<li>id: string (UUID) - идентификатор компании.</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>include_related: boolean - принимается для совместимости с <code>POST /admin_export</code>, ни на что не влияет. Необязательно.</li>\n<li>companies: array - из каких компаний выгружать. Необязательно. Берётся пересечение с компаниями, где у пользователя роль Администратор или выше; если поле не передано — все такие компании. Если пересечение пустое, задача завершится ошибкой «У Вас недостаточно прав для этого действия».<ul>\n<li>id: string (UUID) - идентификатор компании. Обязательно для элемента.</li>\n</ul>\n</li>\n</ul>\n<p>Если среди <code>ids</code> есть записи, которых нет или к которым нет доступа, выгрузка не падает: они перечисляются в <code>summary.errors</code> с причиной <code>not_found_or_no_access</code>.</p>\n<hr />\n<p><strong>Пример запроса:</strong>\nДва пользователя по идентификаторам и все водители с ролью «Редактор» из одной компании, в имени которых есть «иванов».</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"entities\": {\n    \"users\": {\"ids\": [\"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"b23456c3-7890-2bc3-4de5-2bc345de6f78\"]},\n    \"drivers\": {\n      \"all\": true,\n      \"filter\": {\n        \"field\": \"name\",\n        \"value\": \"иванов\",\n        \"conditions\": [{\"field\": \"role_key\", \"values\": [\"EDITOR\"]}]\n      }\n    }\n  },\n  \"companies\": [{\"id\": \"c34567d4-8901-3cd4-5ef6-3cd456ef7a89\"}]\n}\n</code></pre><hr />\n<p><strong>Ответ:</strong>\nКод 200. Задача поставлена в очередь, дальше её статус запрашивается по <code>job_id</code>.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\"\n}\n</code></pre><p>Код 422, если тело запроса не JSON:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"code\": 4220,\n  \"field\": \"\",\n  \"message\": \"Недопустимый параметр body\"\n}\n</code></pre><p>Код 403, если роль ниже Администратора:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"code\": 4030,\n  \"field\": \"\",\n  \"message\": \"Доступ запрещен, обратитесь к администратору\"\n}\n</code></pre>",
        "operationId": "post_auth_admin_export",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "entities": {
                    "type": "object",
                    "properties": {
                      "users": {
                        "type": "object",
                        "properties": {
                          "ids": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        }
                      },
                      "drivers": {
                        "type": "object",
                        "properties": {
                          "all": {
                            "type": "boolean"
                          },
                          "filter": {
                            "type": "object",
                            "properties": {
                              "field": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              },
                              "conditions": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "field": {
                                      "type": "string"
                                    },
                                    "values": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "companies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "entities": {
                  "users": {
                    "ids": [
                      "a12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                      "b23456c3-7890-2bc3-4de5-2bc345de6f78"
                    ]
                  },
                  "drivers": {
                    "all": true,
                    "filter": {
                      "field": "name",
                      "value": "иванов",
                      "conditions": [
                        {
                          "field": "role_key",
                          "values": [
                            "EDITOR"
                          ]
                        }
                      ]
                    }
                  }
                },
                "companies": [
                  {
                    "id": "c34567d4-8901-3cd4-5ef6-3cd456ef7a89"
                  }
                ]
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "parameters": []
      }
    },
    "/api_v1/auth_admin_export/jobs": {
      "get": {
        "tags": [
          "Экспорт сущностей"
        ],
        "summary": "/auth_admin_export/jobs",
        "description": "<p><strong>Получение списка задач экспорта пользователей и водителей</strong></p>\n<hr />\n<p>Возвращает задачи экспорта пользователей и водителей, которые поставил текущий пользователь, в любом статусе, новые первыми. Нужен, чтобы после перезагрузки страницы вернуться к незавершённым выгрузкам. Задача пропадает из списка через 30 минут после завершения. Задачи <code>POST /admin_export</code> сюда не попадают — они в <code>GET /admin_export/jobs</code>.</p>\n<hr />\n<p><strong>Роль:</strong> Администратор и выше.</p>\n<hr />\n<p><strong>Параметры:</strong> нет.</p>\n<hr />\n<p><strong>Ответ:</strong>\nКод 200. Массив задач, формат элемента — как в ответе <code>GET /auth_admin_export/status/:jobId</code>. Если задач нет, приходит пустой массив <code>[]</code>.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>[\n  {\n    \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n    \"status\": \"running\",\n    \"created_at\": \"2026-09-23T09:15:02.418Z\",\n    \"percent\": 20\n  },\n  {\n    \"job_id\": \"e56789f6-0123-5ef6-7ab8-5ef678ab9c01\",\n    \"status\": \"done\",\n    \"created_at\": \"2026-09-23T09:02:47.105Z\",\n    \"summary\": {\"total\": 1, \"by_type\": {\"users\": 1}, \"errors\": []},\n    \"filename\": \"users_a12345b2-6789-1ab2-3cd4-1ab234cd5e67.json\",\n    \"download_path\": \"/api_v1/files/exports_entites/f67890a7-1234-6fa7-8bc9-6fa789bc0d12.json\"\n  }\n]\n</code></pre><p>Код 403, если роль ниже Администратора:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"code\": 4030,\n  \"field\": \"\",\n  \"message\": \"Доступ запрещен, обратитесь к администратору\"\n}\n</code></pre>",
        "operationId": "get_auth_admin_export_jobs",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min",
        "parameters": []
      }
    },
    "/api_v1/auth_admin_export/status/{jobId}": {
      "get": {
        "tags": [
          "Экспорт сущностей"
        ],
        "summary": "/auth_admin_export/status/:jobId",
        "description": "<p><strong>Получение статуса задачи экспорта пользователей и водителей</strong></p>\n<hr />\n<p>Возвращает ход выполнения и результат задачи. Клиент опрашивает метод, пока <code>status</code> не станет <code>done</code> или <code>error</code>. Задача видна только тому, кто её поставил: для чужой задачи ответ такой же, как для несуществующей.</p>\n<hr />\n<p><strong>Роль:</strong> Администратор и выше.</p>\n<hr />\n<p><strong>Параметры:</strong></p>\n<ul>\n<li>jobId: string (UUID) - идентификатор задачи из ответа <code>POST /auth_admin_export</code>. Обязательно, передаётся в пути.</li>\n</ul>\n<hr />\n<p><strong>Ответ:</strong>\nПоля ответа:</p>\n<ul>\n<li>job_id: string (UUID) - идентификатор задачи.</li>\n<li>status: string - <code>waiting</code> — в очереди, <code>running</code> — выполняется, <code>done</code> — готово, <code>error</code> — ошибка.</li>\n<li>created_at: string - время создания задачи, ISO 8601, UTC.</li>\n<li>percent: number - прогресс от 0 до 100. Есть только при <code>running</code>: 0–20 — выборка записей, 20–100 — запись файла.</li>\n<li>summary: object - итог выгрузки. Есть только при <code>done</code>.<ul>\n<li>total: number - сколько записей выгружено.</li>\n<li>by_type: object - сколько записей каждого типа (<code>users</code>, <code>drivers</code>).</li>\n<li>errors: array - что не удалось выгрузить. <code>type</code> — тип сущности, <code>id</code> или <code>field</code> — запись или поле фильтра, <code>reason</code>: <code>unknown_entity_type</code> — неизвестный тип (всё, кроме <code>users</code> и <code>drivers</code>), <code>not_found_or_no_access</code> — запись не найдена или нет доступа, <code>invalid_filter_field</code> — по полю нельзя фильтровать, <code>record_limit_exceeded</code> — превышен лимит 20 000 записей для выборки по <code>ids</code> (при <code>all: true</code> лишнее отсекается без ошибки).</li>\n</ul>\n</li>\n<li>filename: string - имя файла для сохранения. Есть при <code>done</code>, если выгружена хотя бы одна запись. Одна запись — <code><тип>_<id>.json</code>, несколько — <code>skif_export_<uuid>.zip</code>, внутри архива файлы <code><тип>/<тип>_<id>.json</code>.</li>\n<li>download_path: string - путь для скачивания файла на том же домене. Есть там же, где <code>filename</code>. Файл хранится 30 минут.</li>\n<li>error: object - есть только при <code>error</code>.<ul>\n<li>code: number - всегда <code>4220</code>.</li>\n<li>message: string - текст ошибки на языке пользователя.</li>\n</ul>\n</li>\n</ul>\n<p>Код 200, выполняется:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n  \"status\": \"running\",\n  \"created_at\": \"2026-09-23T09:15:02.418Z\",\n  \"percent\": 60\n}\n</code></pre><p>Код 200, готово:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n  \"status\": \"done\",\n  \"created_at\": \"2026-09-23T09:15:02.418Z\",\n  \"summary\": {\n    \"total\": 14,\n    \"by_type\": {\"users\": 1, \"drivers\": 13},\n    \"errors\": [\n      {\"type\": \"users\", \"id\": \"b23456c3-7890-2bc3-4de5-2bc345de6f78\", \"reason\": \"not_found_or_no_access\"}\n    ]\n  },\n  \"filename\": \"skif_export_a78901b8-2345-7ab8-9cd0-7ab890cd1e23.zip\",\n  \"download_path\": \"/api_v1/files/exports_entites/b89012c9-3456-8bc9-0de1-8bc901de2f34.zip\"\n}\n</code></pre><p>Если ничего не выгрузилось, при <code>done</code> приходит только <code>summary</code> с <code>total: 0</code>, а <code>filename</code> и <code>download_path</code> отсутствуют.</p>\n<p>Код 200, ошибка:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"job_id\": \"d45678e5-9012-4de5-6fa7-4de567fa8b90\",\n  \"status\": \"error\",\n  \"created_at\": \"2026-09-23T09:15:02.418Z\",\n  \"error\": {\n    \"code\": 4220,\n    \"message\": \"Недопустимый параметр entities\"\n  }\n}\n</code></pre><p>Возможные сообщения ошибки: «У Вас недостаточно прав для этого действия» (нет компаний, где пользователь Администратор или выше, или пересечение с <code>companies</code> пустое), «Недопустимый параметр body» (тело не разобралось), «Недопустимый параметр entities», «Внутренняя ошибка сервера. Пожалуйста, свяжитесь с администратором.».</p>\n<p>Код 404, если задачи нет: неверный <code>jobId</code>, задачу поставил другой пользователь или прошло больше 30 минут после завершения.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"error\": \"job_not_found\"\n}\n</code></pre><p>Код 400, если <code>jobId</code> не является UUID.</p>\n<p>Код 403, если роль ниже Администратора:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"code\": 4030,\n  \"field\": \"\",\n  \"message\": \"Доступ запрещен, обратитесь к администратору\"\n}\n</code></pre>",
        "operationId": "get_auth_admin_export_status__jobId",
        "responses": {
          "200": {
            "description": "Успешный ответ"
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (отчет, шаблон или задача экспорта) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка в формуле, не найдены объекты в запросе)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов к расчетному ядру отчетов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Параметр jobId"
          }
        ],
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/company/{id}/updates/query": {
      "post": {
        "tags": [
          "Компания"
        ],
        "summary": "/company/:id/updates/query",
        "description": "**Получение истории изменения сущностей из админ панели**\n\n---\n\n**Роль:** Супервизор и выше.\n\n---\n\nПример запроса для одной сущности:\n\n```\n{\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-10-01 00:00:00\",\n    \"object_id\": \"b56f98e9-7c8e-4cda-a642-6d4e207de5d4\",\n    \"first_row\": 0,\n    \"max_rows\": 100,\n    \"sortField\": \"created\",\n    \"sortDesc\": true\n}\n\n ```\n\nПример запроса для всего справочника units:\n\n```\n{\n    \"from\": \"2020-11-01 00:00:00\",\n    \"to\": \"2020-10-01 00:00:00\",\n    \"objects\": \"units\",\n    \"first_row\": 0,\n    \"max_rows\": 100,\n    \"sortField\": \"created\",\n    \"sortDesc\": true,\n    \"value\": \"user1\"\n}\n\n ```\n\nЗапрос данных ограничен периодом в один год\n\n**Возможные параметры:**\n\nmax_rows - максимальное количество строк.\n\nfrom - дата-время от какой выдавать данные, необязательный параметр. По умолчанию - текущее время минус 7 дней.\n\nto - дата-время до какой выдавать данные, необязательный параметр. По умолчанию - текущее время.\n\nfirst_row - первая строка, необязательный параметр. По умолчанию 0.\n\nmax_rows - максимальное количество строк в выдаче, необязательный параметр. По умолчанию 10000.\n\nobject_id - если нужно запросить изменение по конкретной сущности, используйте id нужной сущности, необязательный параметр.\n\nobjects - по каким типам сущностей возвращать историю - users, units, company, unitsgroup, units_trailers, geozones, report_templates, notifications, routes, trips, trailers, mailings.\n\nsortField - имя поля для сортировки результатов, возможные значения: created, user.name, operation.\n\nsortDesc - true, если надо соортировать по убыванию.\n\nvalue - искомый текст.\n\n---\n\n**Пример ответа:**\n\n```\n{\n    \"list\": [{\n        \"created\": \"2020-11-11 15:55:33\",\n        \"user\": {\n            \"id\": \"5551b5bd-b4d7-4f99-a166-c9ecdabccee0\",\n            \"name\": \"user1\",\n            \"email\": \"support@example.com\"\n        },\n        \"objects\": \"company\",\n        \"operation\": \"PUT\",\n        \"object_id\": \"11e541f5-3b57-4968-a428-eb13dde6ede0\",\n        \"msg\": \"Пользователь user1 обновил настройки компании\"\n    }],\n    \"max_rows\": 1\n}\n\n ```\n\ncreated - дата время\n\nobjects - тип сущностей\n\nuser - автор изменений\n\noperation - операция PUT, DELETE, POST - изменение, удаление, создание\n\nobject_id - id объекта\n\nmsg - текст",
        "operationId": "companyIdUpdatesQuery",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "first_row": {
                    "type": "number",
                    "example": 0
                  },
                  "from": {
                    "type": "string",
                    "example": "2021-01-05 00:00:00"
                  },
                  "max_rows": {
                    "type": "number",
                    "example": 100
                  },
                  "objects": {
                    "type": "string",
                    "example": "units"
                  },
                  "sortDesc": {
                    "type": "boolean",
                    "example": true
                  },
                  "sortField": {
                    "type": "string",
                    "example": "user.name"
                  },
                  "to": {
                    "type": "string",
                    "example": "2021-12-12 23:59:59"
                  }
                }
              },
              "examples": {
                "/company/:id/updates/query": {
                  "value": {
                    "first_row": 0,
                    "from": "2021-01-05 00:00:00",
                    "max_rows": 100,
                    "objects": "units",
                    "sortDesc": true,
                    "sortField": "user.name",
                    "to": "2021-12-12 23:59:59"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-rate-limit": "20 req/min",
        "x-min-role": "Admin",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "UUID компании",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "example": ""
          },
          "description": "ID компании"
        }
      ]
    },
    "/api_v1/units/{unit_id}/files": {
      "get": {
        "tags": [
          "Объекты"
        ],
        "summary": "Получение файла объекта по URL",
        "description": "**Получение файла объекта по URL**\n\n---\n\n**Параметры:**  \nid - ID объекта  \nurl - URL файла\n\n---\n\n**Роль:** Читатель и выше.",
        "operationId": "unitsIdFilesUrlUrl",
        "parameters": [
          {
            "name": "unit_id",
            "in": "path",
            "required": true,
            "description": "Уникальный идентификатор объекта (UUID)",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "e06bdde8-6f5b-48f1-8406-4fbd61fbe036"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Относительный путь к файлу",
            "schema": {
              "type": "string",
              "example": "/media/units/photos/862531040000001/2026_09/2026_09_08_12_00_00_0.jpg"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Ошибка валидации параметров запроса",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не аутентифицирован (сессия отсутствует или недействительна)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Доступ запрещен (недостаточно прав)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Ошибка обработки сущности (бизнес-валидация)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит запросов (Rate Limit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "Reader",
        "x-rate-limit": "60 req/min"
      }
    },
    "/api_v1/loadwln/{company_id}/geozones/create": {
      "post": {
        "tags": [
          "Импорт из Wialon"
        ],
        "summary": "Импорт геозон компании из файла Wialon/KML",
        "description": "Загрузка и парсинг файла геозон формата Wialon (WLP/KML) с созданием геозон в указанной компании.",
        "operationId": "loadwlnCompanyGeozonesCreate",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "admin",
        "x-rate-limit": "10 req/min",
        "parameters": [
          {
            "name": "company_id",
            "in": "path",
            "required": true,
            "description": "UUID целевой компании",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "2f2c629a-9087-4925-8240-d6d6b90aafda"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Результат импорта геозон",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "example": true
                    },
                    "count": {
                      "type": "integer",
                      "example": 25
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации входных параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия устарела",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа для выполнения операции",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (объект, интервал, счет или компания) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка валидации дат, превышение лимита строк)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api_v1/terminals/columns/{terminal_type}/{imei}": {
      "get": {
        "tags": [
          "Терминалы",
          "Другое"
        ],
        "summary": "Получение списка распознанных колонок и параметров терминала",
        "description": "Возвращает перечень доступных параметров телеметрии для связки типа терминала и IMEI объекта.",
        "operationId": "getTerminalsColumnsByTypeAndImei",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "reader",
        "x-rate-limit": "60 req/min",
        "parameters": [
          {
            "name": "terminal_type",
            "in": "path",
            "required": true,
            "description": "Ключ протокола терминала (navtelecom, arnavi, teltonika и др.)",
            "schema": {
              "type": "string",
              "example": "arnavi"
            }
          },
          {
            "name": "imei",
            "in": "path",
            "required": true,
            "description": "IMEI терминала (15 цифр)",
            "schema": {
              "type": "string",
              "example": "862531040000001"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Список параметров телеметрии терминала",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "example": "voltage_main"
                      },
                      "name": {
                        "type": "string",
                        "example": "Напряжение питания"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Терминалы",
          "Другое"
        ],
        "summary": "Сохранение настроек колонок параметров терминала",
        "description": "Конфигурация соответствия телематических параметров и датчиков для указанного типа терминала и IMEI.",
        "operationId": "postTerminalsColumnsByTypeAndImei",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-min-role": "dispatcher",
        "x-rate-limit": "30 req/min",
        "parameters": [
          {
            "name": "terminal_type",
            "in": "path",
            "required": true,
            "description": "Ключ типа терминала",
            "schema": {
              "type": "string",
              "example": "arnavi"
            }
          },
          {
            "name": "imei",
            "in": "path",
            "required": true,
            "description": "IMEI терминала",
            "schema": {
              "type": "string",
              "example": "862531040000001"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "columns": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Настройки успешно сохранены",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "example": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Некорректный запрос или ошибка валидации параметров",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Пользователь не авторизован или сессия завершена",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Недостаточно прав доступа (требуется повышенная роль)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Запрашиваемый ресурс (вложение, код, задача удаления или ретранслятор) не найден",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Необрабатываемая сущность (ошибка формата или данных)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Превышен лимит частоты запросов (Rate limit exceeded)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api_v1/drivers/import_csv": {
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "Импорт водителей из CSV",
        "operationId": "importDriversCsv",
        "description": "**Импорт водителей из CSV**\n\n---\n\nСоздает водителей пачкой. Файл CSV разбирает клиент: сопоставляет колонки (ФИО; ФИО и код; ФИО, код и телефон) и передает готовые строки. Каждый водитель создается с ролью «Без доступа», `is_driver: true`, случайным паролем, техническим email вида `driver_<hex10>@nomail.skif.pro` и языком платформы по умолчанию.\n\nСтроки с ошибками пропускаются и возвращаются в `errors`, остальные сохраняются одной транзакцией.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Параметры:**\n- rows: array - строки для импорта. Обязательно. От 1 до 1000 строк.\n  - name: string - ФИО водителя. Обязательно.\n  - code: string - код водителя (ключ, RFID). Необязательно. Только цифры. Уникален в компании и в пределах запроса.\n  - phone: string - телефон. Необязательно. Уникален в системе и в пределах запроса.\n- companies: array - компании, в которые импортировать водителей (для админ-панели). Необязательно. По умолчанию — активная компания. Водитель создается один раз и добавляется в каждую компанию с ролью «Без доступа». У запрашивающего в каждой компании должна быть роль «Администратор» и выше. Код водителя должен быть свободен в каждой компании.\n  - id: string (UUID) - идентификатор компании. Обязательно для каждого элемента.\n- company_id: string (UUID) - одна компания для импорта, то же, что `companies` с одним элементом. Необязательно. Если передан `companies`, не учитывается.\n\n---\n\n**Пример запроса:**\n\n```\n{\n  \"rows\": [\n    {\"name\": \"Иванов Иван Иванович\"},\n    {\"name\": \"Сидоров Сидор Сидорович\", \"code\": \"101\"},\n    {\"name\": \"Козлов Павел Петрович\", \"code\": \"102\", \"phone\": \"+79990000002\"},\n    {\"name\": \"Дубль Кода\", \"code\": \"101\"}\n  ]\n}\n```\n\n---\n\n**Ответ:**\n`created` — сколько водителей создано. `errors` — пропущенные строки: `row` — номер строки с 1, `field` — поле с ошибкой (`name`, `code`, `phone`), `message` — текст ошибки. `list` — созданные водители.\n\n```\n{\n  \"created\": 3,\n  \"errors\": [\n    {\"row\": 4, \"name\": \"Дубль Кода\", \"field\": \"code\", \"message\": \"Водитель с кодом 101 уже есть в компании\"}\n  ],\n  \"list\": [\n    {\"id\": \"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"name\": \"Иванов Иван Иванович\", \"code\": null, \"is_driver\": true},\n    {\"id\": \"c12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"name\": \"Сидоров Сидор Сидорович\", \"code\": 101, \"is_driver\": true},\n    {\"id\": \"d12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"name\": \"Козлов Павел Петрович\", \"code\": 102, \"is_driver\": true}\n  ]\n}\n```\n\nКод 422:\n- `rows` не передан или пустой;\n- строк больше 1000 (`validation.errors.tooManyRows`);\n- компания не найдена или у запрашивающего в ней роль ниже «Администратора» (`validation.errors.companyNotFound`).\n",
        "x-min-role": "Admin",
        "x-rate-limit": "10 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "rows"
                ],
                "properties": {
                  "companies": {
                    "type": "array",
                    "description": "Компании для импорта (админ-панель); по умолчанию активная. Запись добавляется в каждую компанию",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "example": "a4f6c292-5a8a-4edd-93b0-c5f3ea20c5db"
                        }
                      }
                    }
                  },
                  "company_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Компания для импорта (админ-панель); по умолчанию активная"
                  },
                  "rows": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "object",
                      "required": [
                        "name"
                      ],
                      "properties": {
                        "name": {
                          "type": "string",
                          "example": "Иванов Иван Иванович"
                        },
                        "code": {
                          "type": "string",
                          "example": "101"
                        },
                        "phone": {
                          "type": "string",
                          "example": "+79990000002"
                        }
                      }
                    }
                  }
                }
              },
              "examples": {
                "Три водителя": {
                  "value": {
                    "rows": [
                      {
                        "name": "Иванов Иван Иванович"
                      },
                      {
                        "name": "Сидоров Сидор Сидорович",
                        "code": "101"
                      },
                      {
                        "name": "Козлов Павел Петрович",
                        "code": "102",
                        "phone": "+79990000002"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "created — создано, errors — пропущенные строки, list — созданные водители",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "created": {
                      "type": "integer"
                    },
                    "errors": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "row": {
                            "type": "integer"
                          },
                          "name": {
                            "type": "string"
                          },
                          "field": {
                            "type": "string"
                          },
                          "message": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "list": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  }
                },
                "example": {
                  "created": 3,
                  "errors": [
                    {
                      "row": 4,
                      "name": "Дубль Кода",
                      "field": "code",
                      "message": "Водитель с кодом 101 уже есть в компании"
                    }
                  ],
                  "list": [
                    {
                      "id": "a4f6c292-5a8a-4edd-93b0-c5f3ea20c5db",
                      "name": "Иванов Иван Иванович",
                      "code": null,
                      "is_driver": true
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/429RateLimit"
          }
        }
      }
    },
    "/api_v1/users/import_csv": {
      "post": {
        "tags": [
          "Пользователь"
        ],
        "summary": "Импорт пользователей из CSV",
        "operationId": "importUsersCsv",
        "description": "**Импорт пользователей из CSV**\n\n---\n\nСоздает пользователей активной компании пачкой. Пользователи входят по логину и паролю. Файл CSV разбирает клиент и передает готовые строки: логин, пароль и необязательный email. Всей пачке назначается одна роль и язык платформы по умолчанию. Письма о создании аккаунтов не отправляются.\n\nСтроки с ошибками пропускаются и возвращаются в `errors`, остальные сохраняются одной транзакцией.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Параметры:**\n- role: object - роль для всех импортируемых пользователей. Необязательно. По умолчанию «Наблюдатель» (`OBSERVER`). Роль не выше «Администратора» и не выше роли запрашивающего.\n  - id: string (UUID) - идентификатор роли, список ролей — `GET /roles`. Необязательно, если указан key. Роль, созданная в компании, должна принадлежать активной компании.\n  - key: string - ключ базовой роли. Необязательно, если указан id. Возможные значения: `NO_ACCESS`, `OBSERVER`, `READER`, `OPERATOR`, `EDITOR`, `ADMIN`.\n- companies: array - компании, в которые импортировать пользователей (для админ-панели). Необязательно. По умолчанию — активная компания. Пользователь создается один раз и добавляется в каждую компанию с одной ролью. У запрашивающего в каждой компании должна быть роль «Администратор» и выше. Роль, созданная в компании, подходит только при импорте в эту одну компанию. Пароль проверяется по строгой политике, если она включена хотя бы в одной из компаний.\n  - id: string (UUID) - идентификатор компании. Обязательно для каждого элемента.\n- rows: array - строки для импорта. Обязательно. От 1 до 1000 строк.\n  - login: string - логин. Обязательно. Уникален во всей системе и в пределах запроса, без пробелов в начале и конце и без двойных пробелов.\n  - password: string - пароль. Обязательно. Проверяется по парольной политике компании.\n  - email: string - email. Необязательно. Если не передан, генерируется технический адрес `@nomail.skif.pro`.\n\n---\n\n**Пример запроса:**\n\n```\n{\n  \"role\": {\"id\": \"b12345b2-6789-1ab2-3cd4-1ab234cd5e67\"},\n  \"rows\": [\n    {\"login\": \"dispatcher_1\", \"password\": \"Passw0rd!\"},\n    {\"login\": \"dispatcher_2\", \"password\": \"Passw0rd!\", \"email\": \"demo_user@skif.pro\"},\n    {\"login\": \"dispatcher_1\", \"password\": \"Passw0rd!\"}\n  ]\n}\n```\n\n---\n\n**Ответ:**\n`created` — сколько пользователей создано. `errors` — пропущенные строки: `row` — номер строки с 1, `field` — поле с ошибкой (`login`, `password`, `email`), `message` — текст ошибки. `list` — созданные пользователи.\n\n```\n{\n  \"created\": 2,\n  \"errors\": [\n    {\"row\": 3, \"login\": \"dispatcher_1\", \"field\": \"login\", \"message\": \"Такое имя уже используется в системе, выберите другое, или деактивируйте возможность логина по имени\"}\n  ],\n  \"list\": [\n    {\"id\": \"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"name\": \"dispatcher_1\", \"email\": \"k3j9x0a1b2c3@nomail.skif.pro\"},\n    {\"id\": \"c12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"name\": \"dispatcher_2\", \"email\": \"demo_user@skif.pro\"}\n  ]\n}\n```\n\nКод 422:\n- `rows` не передан или пустой;\n- строк больше 1000 (`validation.errors.tooManyRows`);\n- компания из `companies` не найдена или у запрашивающего в ней роль ниже «Администратора» (`validation.errors.companyNotFound`);\n- роль не найдена;\n- роль выше «Администратора» или выше роли запрашивающего (`session.errors.noPermission`).\n",
        "x-min-role": "Admin",
        "x-rate-limit": "10 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "rows"
                ],
                "properties": {
                  "companies": {
                    "type": "array",
                    "description": "Компании для импорта (админ-панель); по умолчанию активная. Запись добавляется в каждую компанию",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid",
                          "example": "a4f6c292-5a8a-4edd-93b0-c5f3ea20c5db"
                        }
                      }
                    }
                  },
                  "role": {
                    "type": "object",
                    "description": "Роль: id из GET /roles или key базовой роли",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "example": "6592d562-e965-43bd-9d9e-8319cabd6291"
                      },
                      "key": {
                        "type": "string",
                        "enum": [
                          "NO_ACCESS",
                          "OBSERVER",
                          "READER",
                          "OPERATOR",
                          "EDITOR",
                          "ADMIN"
                        ],
                        "example": "OBSERVER"
                      }
                    }
                  },
                  "rows": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "object",
                      "required": [
                        "login",
                        "password"
                      ],
                      "properties": {
                        "login": {
                          "type": "string",
                          "example": "dispatcher_1"
                        },
                        "password": {
                          "type": "string",
                          "example": "Passw0rd!"
                        },
                        "email": {
                          "type": "string",
                          "format": "email",
                          "example": "demo_user@skif.pro"
                        }
                      }
                    }
                  }
                }
              },
              "examples": {
                "Два пользователя": {
                  "value": {
                    "role": {
                      "key": "OBSERVER"
                    },
                    "rows": [
                      {
                        "login": "dispatcher_1",
                        "password": "Passw0rd!"
                      },
                      {
                        "login": "dispatcher_2",
                        "password": "Passw0rd!",
                        "email": "demo_user@skif.pro"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "created — создано, errors — пропущенные строки, list — созданные пользователи",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "created": {
                      "type": "integer"
                    },
                    "errors": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "row": {
                            "type": "integer"
                          },
                          "login": {
                            "type": "string"
                          },
                          "field": {
                            "type": "string"
                          },
                          "message": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "list": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  }
                },
                "example": {
                  "created": 2,
                  "errors": [
                    {
                      "row": 3,
                      "login": "dispatcher_1",
                      "field": "login",
                      "message": "Такое имя уже используется в системе, выберите другое, или деактивируйте возможность логина по имени"
                    }
                  ],
                  "list": [
                    {
                      "id": "a4f6c292-5a8a-4edd-93b0-c5f3ea20c5db",
                      "name": "dispatcher_1",
                      "email": "k3j9x0a1b2c3@nomail.skif.pro"
                    },
                    {
                      "id": "c12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                      "name": "dispatcher_2",
                      "email": "demo_user@skif.pro"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "$ref": "#/components/responses/422Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/429RateLimit"
          }
        }
      }
    },
    "/api_v1/users/roles/bulk": {
      "patch": {
        "tags": [
          "Пользователь"
        ],
        "summary": "Массовая смена роли пользователей",
        "operationId": "bulkChangeUsersRole",
        "description": "**Массовая смена роли пользователей**\n\n---\n\nНазначает одну роль нескольким пользователям активной компании. Права пользователей в группах объектов пересчитываются под новую роль так же, как при смене роли в карточке пользователя. Если хотя бы одному пользователю роль сменить нельзя, роли не меняются ни у кого.\n\nНельзя менять роль себе и пользователю с ролью выше, чем у запрашивающего.\n\n---\n\n**Роль:** Администратор и выше.\n\n---\n\n**Параметры:**\n- user_ids: array of string (UUID) - пользователи, которым меняется роль. Обязательно. От 1 до 1000. Все пользователи должны состоять в активной компании.\n- role: object - новая роль. Обязательно. Роль не выше «Администратора» и не выше роли запрашивающего.\n  - id: string (UUID) - идентификатор роли, список ролей — `GET /roles`. Обязательно, если не указан key.\n  - key: string - ключ базовой роли. Обязательно, если не указан id. Возможные значения: `NO_ACCESS`, `OBSERVER`, `READER`, `OPERATOR`, `EDITOR`, `ADMIN`.\n\n---\n\n**Пример запроса:**\n\n```\n{\n  \"role\": {\"id\": \"b12345b2-6789-1ab2-3cd4-1ab234cd5e67\"},\n  \"user_ids\": [\n    \"a12345b2-6789-1ab2-3cd4-1ab234cd5e67\",\n    \"c12345b2-6789-1ab2-3cd4-1ab234cd5e67\"\n  ]\n}\n```\n\n---\n\n**Ответ:**\n`updated` — у скольких пользователей сменилась роль.\n\n```\n{\n  \"updated\": 2\n}\n```\n\nКод 422, если хотя бы один пользователь не прошел проверку: роли не меняются, в `errors` по одной записи на каждого такого пользователя, `field` — его id.\n\n```\n{\n  \"code\": 4220,\n  \"message\": \"Указанный пользователь не найден\",\n  \"errors\": [\n    {\"code\": 4220, \"field\": \"c12345b2-6789-1ab2-3cd4-1ab234cd5e67\", \"message\": \"Указанный пользователь не найден\"}\n  ]\n}\n```\n\nКод 422 также возвращается, если:\n- `user_ids` не передан, пустой или содержит не UUID;\n- пользователей больше 1000;\n- роль не передана или не найдена;\n- роль выше «Администратора» или выше роли запрашивающего (`session.errors.noPermission`).\n",
        "x-min-role": "Admin",
        "x-rate-limit": "10 req/min",
        "security": [
          {
            "CookieAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "user_ids",
                  "role"
                ],
                "properties": {
                  "user_ids": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    }
                  },
                  "role": {
                    "type": "object",
                    "description": "Роль: id из GET /roles или key базовой роли",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "example": "6592d562-e965-43bd-9d9e-8319cabd6291"
                      },
                      "key": {
                        "type": "string",
                        "enum": [
                          "NO_ACCESS",
                          "OBSERVER",
                          "READER",
                          "OPERATOR",
                          "EDITOR",
                          "ADMIN"
                        ],
                        "example": "OBSERVER"
                      }
                    }
                  }
                }
              },
              "examples": {
                "Роль по id": {
                  "value": {
                    "role": {
                      "id": "6592d562-e965-43bd-9d9e-8319cabd6291"
                    },
                    "user_ids": [
                      "a4f6c292-5a8a-4edd-93b0-c5f3ea20c5db",
                      "c12345b2-6789-1ab2-3cd4-1ab234cd5e67"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "updated — у скольких пользователей сменилась роль",
            "content": {
              "application/json": {
                "example": {
                  "updated": 2
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/403Forbidden"
          },
          "422": {
            "description": "Роль не сменилась ни у кого: errors[].field — id пользователя, не прошедшего проверку; либо ошибка параметров",
            "content": {
              "application/json": {
                "example": {
                  "code": 4220,
                  "message": "Указанный пользователь не найден",
                  "errors": [
                    {
                      "code": 4220,
                      "field": "c12345b2-6789-1ab2-3cd4-1ab234cd5e67",
                      "message": "Указанный пользователь не найден"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429RateLimit"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Авторизация"
    },
    {
      "name": "Пользователь"
    },
    {
      "name": "Общее"
    },
    {
      "name": "Компания",
      "description": "Методы связанные с компанией"
    },
    {
      "name": "Геозоны",
      "description": "Работа с Гоезонами"
    },
    {
      "name": "Пользовательский тип геозоны"
    },
    {
      "name": "Группы геозон"
    },
    {
      "name": "Маршруты",
      "description": "Работа с Маршрутами"
    },
    {
      "name": "Рейсы",
      "description": "Работа с Рейсами"
    },
    {
      "name": "Объекты",
      "description": "API по работе с Объектами"
    },
    {
      "name": "Группы объектов"
    },
    {
      "name": "Смены",
      "description": "API по работе со сменами"
    },
    {
      "name": "Прицепы объектов",
      "description": "API по работе со связью прицепов и объектов"
    },
    {
      "name": "Состояния объекта",
      "description": "Архив состояний объекта"
    },
    {
      "name": "Прицепы",
      "description": "API по работе с Прицепами"
    },
    {
      "name": "События",
      "description": "API по работе с событиями"
    },
    {
      "name": "Мониторинг"
    },
    {
      "name": "Отчеты"
    },
    {
      "name": "Шаблоны отчетов"
    },
    {
      "name": "Треки"
    },
    {
      "name": "Уведомления"
    },
    {
      "name": "Рассылки"
    },
    {
      "name": "Биллинг",
      "description": "Методы для интеграции с сервисом биллинга"
    },
    {
      "name": "Терминалы",
      "description": "API по работе с Терминалами"
    },
    {
      "name": "Ретрансляции",
      "description": "API по работе с Ретрансляциями"
    },
    {
      "name": "Ретрансляция исторических данных",
      "description": "Ретрансляция исторических данных"
    },
    {
      "name": "Команды терминалов",
      "description": "API по работе с команд терминалов"
    },
    {
      "name": "Шаблоны команд терминалов",
      "description": "API по работе с шаблонами команд терминалов"
    },
    {
      "name": "Интеграторы",
      "description": "API по работе с Интеграторами"
    },
    {
      "name": "Коробочное решение",
      "description": "API по работе с коробочным решением"
    },
    {
      "name": "Эмулятор трека"
    },
    {
      "name": "Интеграция с ЕФИС"
    },
    {
      "name": "Отзывы"
    },
    {
      "name": "Ссылки доступа (Локатор)"
    },
    {
      "name": "Импорт из Wialon"
    },
    {
      "name": "Удаление данных"
    },
    {
      "name": "Видео"
    },
    {
      "name": "Группы доступа"
    },
    {
      "name": "Другое"
    },
    {
      "name": "Роли",
      "description": "Работа с ролями"
    },
    {
      "name": "Новости"
    },
    {
      "name": "Датчики"
    },
    {
      "name": "Счета"
    },
    {
      "name": "Инструменты"
    },
    {
      "name": "Выгрузка данных"
    },
    {
      "name": "Support"
    }
  ],
  "components": {
    "securitySchemes": {
      "CookieAuth": {
        "type": "apiKey",
        "in": "cookie",
        "name": "PLAY_SESSION",
        "description": "Сессионная кука Play Framework, выдается методом POST /login"
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "JWT Bearer токен в заголовке Authorization (возвращается в заголовках при POST /login)"
      },
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "user_company_api_key",
        "description": "Пользовательский API-ключ компании, генерируемый через POST /users/{id}/create_token"
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "example": 4000,
            "description": "Внутренний код ошибки платформы"
          },
          "message": {
            "type": "string",
            "example": "Ошибка валидации параметров",
            "description": "Человекочитаемое описание ошибки"
          },
          "field": {
            "type": "string",
            "example": "email",
            "description": "Поле, вызвавшее ошибку (опционально)"
          }
        },
        "required": [
          "code",
          "message"
        ]
      },
      "PaginatedMeta": {
        "type": "object",
        "properties": {
          "from": {
            "type": "integer",
            "example": 0,
            "description": "Смещение выборки (offset)"
          },
          "count": {
            "type": "integer",
            "example": 50,
            "description": "Количество элементов на странице"
          },
          "sortField": {
            "type": "string",
            "example": "name",
            "description": "Поле сортировки"
          },
          "sortDesc": {
            "type": "boolean",
            "example": false,
            "description": "Сортировка по убыванию"
          },
          "conditions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "field": {
                  "type": "string",
                  "example": "name"
                },
                "value": {
                  "type": "string",
                  "example": "Иван"
                }
              }
            }
          }
        }
      },
      "ReportTemplateItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "d98b5767-0676-447a-8e38-d85c7b2599b6"
          },
          "name": {
            "type": "string",
            "example": "Базовые отчеты"
          },
          "is_default": {
            "type": "boolean",
            "example": true
          },
          "sort": {
            "type": "integer",
            "example": 0
          },
          "template_tables": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string",
                  "example": "Поездки и стоянки"
                },
                "key": {
                  "type": "string",
                  "example": "trips"
                },
                "time_group": {
                  "type": "string",
                  "example": "day"
                },
                "template_columns": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "users_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "_default": {
            "type": "boolean",
            "example": true
          },
          "_delete": {
            "type": "boolean",
            "example": false
          }
        }
      },
      "RetranslatorChannel": {
        "type": "object",
        "description": "Ретрансляция целиком, как её отдаёт API.\n\nОдна ретрансляция — это всегда один объект, даже если за ней стоит\nнесколько терминалов или групп объектов. Внутренние детали хранения\n(`source_type`, `units_group_id`) в ответе не выводятся.\n\n---\n\n**Поля:**\n- `id` — идентификатор ретрансляции. По нему работают `PUT` и `DELETE`;\n  любой идентификатор из `terminals` тоже подходит, потому что все записи\n  ретрансляции хранятся в одной группе с общим идентификатором;\n- `name` — название;\n- `comment` — комментарий;\n- `retrans_protocol` — протокол ретрансляции;\n- `retrans_server` — адрес сервера, на который уходят данные;\n- `retrans_port` — порт сервера;\n- `retrans_pw` — пароль сервера;\n- `is_active` — `true`, если ретрансляция включена;\n- `activate_date` — дата включения, формат `yyyy-MM-dd HH:mm:ss`;\n- `member_name`, `route_name` — водитель и маршрут;\n- `gps_category_type_key` — категория GPS-сигнала;\n- `public_vehicle_type_key` — тип общественного транспорта;\n- `company_id` — компания ретрансляции;\n- `terminals` — терминалы ретрансляции, массив объектов `{imei, to_imei}`;\n- `imei`, `to_imei` — первый непустой терминал из `terminals`. Дублируют\n  данные для случаев, когда ретрансляция состоит из одного терминала.\n\n---\n\n**Что попадает в `terminals`:**\n\n- при создании по списку терминалов — каждый переданный терминал;\n- при создании по группам объектов — терминалы, подписанные на эти группы,\n  которые есть в момент последней синхронизации. Сами группы в ответе не видны;\n- в смешанном режиме — объединённый список ручных терминалов и терминалов\n  групп без дубликатов. Ручные терминалы стоят первыми, и именно первый из\n  них дублируется в полях `imei` и `to_imei`;\n- записи без `imei` в `terminals` не попадают: там только терминалы\n  с непустым `imei`.\n\n---\n\nУ терминала, пришедшего из группы объектов, `to_imei` совпадает с `imei`:\nподменять IMEI при ретрансляции на группу не нужно.\n\n---\n\nВ пустой `terminals` поля `imei` и `to_imei` тоже будут пустыми.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "eeadc5d1-9a68-4083-bef6-51173d532cb0",
            "description": "Идентификатор ретрансляции"
          },
          "name": {
            "type": "string",
            "example": "Ретрансляция в Эрнис1",
            "description": "Название ретрансляции"
          },
          "comment": {
            "type": "string",
            "example": "Комментарий диспетчера",
            "description": "Комментарий"
          },
          "retrans_protocol": {
            "type": "string",
            "example": "retranslator_wilaon_ips",
            "description": "Протокол ретрансляции. Допустимые ключи:\n`retranslator_egts`, `wialon_retranslator`, `retranslator_ips_ext`,\n`ya_transport`, `retranslator_wilaon_ips`, `retranslator_soap`,\n`retranslator_galileo`"
          },
          "retrans_server": {
            "type": "string",
            "example": "195.208.1.1",
            "description": "Адрес сервера ретрансляции"
          },
          "retrans_port": {
            "type": "integer",
            "example": 9001,
            "description": "Порт сервера ретрансляции"
          },
          "retrans_pw": {
            "type": "string",
            "example": "1234",
            "description": "Пароль сервера ретрансляции"
          },
          "is_active": {
            "type": "boolean",
            "example": true,
            "description": "Состояние ретрансляции"
          },
          "activate_date": {
            "type": "string",
            "example": "2026-08-28 00:00:00",
            "description": "Дата включения ретрансляции"
          },
          "member_name": {
            "type": "string",
            "example": "Иванов И.И.",
            "description": "Водитель"
          },
          "route_name": {
            "type": "string",
            "example": "Маршрут 15",
            "description": "Маршрут"
          },
          "gps_category_type_key": {
            "type": "string",
            "example": "gps_category_type_s",
            "description": "Категория GPS-сигнала. Допустимые значения:\n`gps_category_type_s`, `gps_category_type_n`"
          },
          "public_vehicle_type_key": {
            "type": "string",
            "example": "public_vehicle_type_bus",
            "description": "Тип общественного транспортного средства. Допустимые значения:\n`public_vehicle_type_bus`, `public_vehicle_type_trolleybus`,\n`public_vehicle_type_tramway`, `public_vehicle_type_minibus`,\n`public_vehicle_type_water`"
          },
          "company_id": {
            "type": "string",
            "format": "uuid",
            "example": "6c1a0092-9f99-4fb0-a2f3-37eb8db08b31",
            "description": "Компания ретрансляции"
          },
          "imei": {
            "type": "string",
            "example": "862531040000001",
            "description": "IMEI первого непустого терминала ретрансляции"
          },
          "to_imei": {
            "type": "string",
            "example": "862531040000001",
            "description": "IMEI, на который заменяется первый непустой терминал"
          },
          "terminals": {
            "type": "array",
            "description": "Терминалы ретрансляции",
            "items": {
              "type": "object",
              "properties": {
                "imei": {
                  "type": "string",
                  "example": "862531040000001",
                  "description": "IMEI исходного терминала"
                },
                "to_imei": {
                  "type": "string",
                  "example": "862531040000001",
                  "description": "IMEI, на который заменяется исходный терминал"
                }
              }
            }
          }
        },
        "required": [
          "id",
          "name",
          "comment",
          "retrans_protocol",
          "retrans_server",
          "retrans_port",
          "retrans_pw",
          "is_active",
          "company_id",
          "terminals"
        ]
      },
      "RetranslatorRequest": {
        "type": "object",
        "description": "Тело создания и обновления ретрансляции.\n\n---\n\n**Обязательные поля:** `retrans_server`, `retrans_port`, `retrans_protocol`\nи хотя бы один из двух источников — `terminals` или `units_groups_ids`.\n\n---\n\n**Два источника терминалов:**\n\n- `terminals` — ретрансляция на перечисленные вручную терминалы.\n  Каждый терминал должен существовать и быть доступен текущему пользователю.\n  Если сервер из списка серверов SKIF, у каждого терминала обязателен\n  `to_imei`, отличный от `imei`, — иначе данные зациклятся;\n- `units_groups_ids` — ретрансляция на группы объектов. Группы проверяются\n  сервисом объектов: группа должна существовать, быть доступна и все группы\n  должны принадлежать одной компании. Терминалы этих групп подтягиваются\n  сразу при создании, отдельный запрос за ними не нужен.\n\n---\n\n**Смешанный режим.** Поля можно передавать как по отдельности, так и\nодновременно. В смешанном режиме терминалы из `terminals` и из групп\nобъектов объединяются в один список без дубликатов. Если терминал указан\nв `terminals` вручную и одновременно входит в одну из групп, он закрепляется\nкак ручной: при последующем удалении автомобиля из группы его ретрансляция\nне прервётся.\n\nЕсли не передать ни `terminals`, ни `units_groups_ids`, придёт ошибка\nвалидации.",
        "properties": {
          "retrans_server": {
            "type": "string",
            "example": "195.208.1.1",
            "description": "Адрес сервера ретрансляции, на который уходят данные с терминалов.\nОбязательное поле. Должен быть корректным адресом и содержать точку."
          },
          "retrans_port": {
            "type": "integer",
            "example": 9001,
            "description": "Порт сервера ретрансляции. Обязательное поле.\nДопустимое значение — от 0 до 65535."
          },
          "retrans_protocol": {
            "type": "string",
            "example": "retranslator_wilaon_ips",
            "description": "Протокол ретрансляции. Обязательное поле. Допустимые ключи:\n`retranslator_egts`, `wialon_retranslator`, `retranslator_ips_ext`,\n`ya_transport`, `retranslator_wilaon_ips`, `retranslator_soap`,\n`retranslator_galileo`"
          },
          "retrans_pw": {
            "type": "string",
            "example": "1234",
            "description": "Пароль сервера ретрансляции"
          },
          "is_active": {
            "type": "boolean",
            "default": true,
            "example": true,
            "description": "Состояние ретрансляции. По умолчанию `true`. При `true` проставляется\nдата активации, при выключении ретрансляция отписывается от групп объектов."
          },
          "name": {
            "type": "string",
            "example": "Ретрансляция в Эрнис1",
            "description": "Название ретрансляции"
          },
          "comment": {
            "type": "string",
            "example": "Комментарий диспетчера",
            "description": "Комментарий к ретрансляции"
          },
          "member_name": {
            "type": "string",
            "example": "Иванов И.И.",
            "description": "Водитель"
          },
          "route_name": {
            "type": "string",
            "example": "Маршрут 15",
            "description": "Маршрут"
          },
          "gps_category_type_key": {
            "type": "string",
            "example": "gps_category_type_s",
            "description": "Категория GPS-сигнала. Допустимые значения:\n`gps_category_type_s`, `gps_category_type_n`"
          },
          "public_vehicle_type_key": {
            "type": "string",
            "example": "public_vehicle_type_bus",
            "description": "Тип общественного транспортного средства. Допустимые значения:\n`public_vehicle_type_bus`, `public_vehicle_type_trolleybus`,\n`public_vehicle_type_tramway`, `public_vehicle_type_minibus`,\n`public_vehicle_type_water`"
          },
          "company_id": {
            "type": "string",
            "format": "uuid",
            "example": "6c1a0092-9f99-4fb0-a2f3-37eb8db08b31",
            "description": "Компания ретрансляции. Поле необязательное: если его не передать,\nкомпания определяется сама.\n\n- Компания ручного терминала всегда берётся у самого терминала:\n  переданное здесь значение её не переопределяет;\n- Компания терминала, пришедшего из группы объектов, всегда берётся\n  у группы-источника;\n- Компания самого канала определяется по этому полю, если оно передано,\n  иначе по компании групп объектов, иначе по компании одного из\n  ручных терминалов. Если определить не удалось, придёт ошибка\n  валидации.\n\nВ режиме `terminals` мастер-записи канала нет, поэтому поле на результат\nне влияет. Передавайте его только когда действительно нужно отступить от\nкомпании групп объектов."
          },
          "terminals": {
            "type": "array",
            "description": "Терминалы для ретрансляции, выбранные вручную. Можно передать вместе\nс `units_groups_ids` — тогда ретрансляция строится в смешанном режиме.\nКомпания каждого терминала берётся у самого терминала.",
            "items": {
              "type": "object",
              "properties": {
                "imei": {
                  "type": "string",
                  "example": "862531040000001",
                  "description": "IMEI терминала-источника"
                },
                "to_imei": {
                  "type": "string",
                  "example": "4324324234",
                  "description": "IMEI, на который заменяется терминал-источник. Обязателен,\nесли сервер принадлежит SKIF, и должен отличаться от `imei`."
                }
              }
            }
          },
          "units_groups_ids": {
            "type": "array",
            "description": "Идентификаторы групп объектов, по которым строится ретрансляция.\nМожно передать вместе с `terminals` — тогда ретрансляция строится\nв смешанном режиме.",
            "items": {
              "type": "string",
              "format": "uuid",
              "example": "1c0b5a44-0f1a-4f7b-9a51-2b7c6f0d1e33"
            }
          }
        },
        "required": [
          "retrans_server",
          "retrans_port",
          "retrans_protocol"
        ]
      }
    },
    "responses": {
      "400BadRequest": {
        "description": "Некорректный запрос или ошибка валидации полей",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "401Unauthorized": {
        "description": "Требуется аутентификация (сессия отсутствует или истекла)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4010,
              "message": "Сессия не найдена или истекла"
            }
          }
        }
      },
      "403Forbidden": {
        "description": "Недостаточно прав доступа для выполнения операции (ролевая модель)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4030,
              "message": "Недостаточно прав для выполнения действия"
            }
          }
        }
      },
      "404NotFound": {
        "description": "Запрашиваемый ресурс не найден",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4040,
              "message": "Сущность не найдена"
            }
          }
        }
      },
      "422Unprocessable": {
        "description": "Ошибка бизнес-логики (например, email уже зарегистрирован, неверный код)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4022,
              "message": "Пользователь с таким email уже зарегистрирован",
              "field": "email"
            }
          }
        }
      },
      "429RateLimit": {
        "description": "Превышен лимит частоты запросов",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4290,
              "message": "Слишком частые запросы. Пожалуйста, подождите"
            }
          }
        }
      }
    }
  }
}