# Админ-панель: все пути и контракты API Документация по всем путям встроенной админ-панели `telesrv` — адресам страниц (SPA) и API-маршрутам, которые за ними стоят. Сервер панели живёт в `cmd/telesrv-admin`, маршруты объявлены в функции `(*server).routes()` (`server.go:50`). Панель — это обычный HTTP-сервер: он отдаёт собранный фронтенд (`/`) и JSON-API под префиксом `/api/`. Все API-пути требуют сессию (cookie), а все изменяющие запросы — ещё и CSRF-токен. Многие маршруты дополнительно проверяют права оператора (`permission`). ## Как пользоваться этим документом - Для каждого GET-эндпоинта указаны **параметры запроса** (query) и краткая форма **ответа**. - Для каждого POST-эндпоинта в блоке `/api/actions/*` и решений верификации указано **тело запроса** (JSON). Все они разделяют общие поля (см. ниже) плюс свои специфичные поля. - `int64` в JSON можно передавать и как число, и как строку (например, `"user_id": "123"` или `"user_id": 123`) — сервер принимает оба варианта (`flexInt64`). `flexUnix` принимает Unix-секунды или дату `2006-01-02` / RFC3339. - Все изменяющие запросы идут в Admin API. Ответ команды — либо `{"status":..., "message":..., "command_id":...}` при успехе (HTTP 200), либо `{"error":..., "code":...}` при ошибке. Конфликт оптимистичной блокировки — `409`. ## Аутентификация и сессия | Метод | Путь | Описание | | --- | --- | --- | | POST | `/api/login` | Вход. Тело: `{"secret": "..."}`. Проверяет секрет из конфига, выдаёт подписанную cookie-сессию и cookie CSRF. Единственный изменяющий маршрут без CSRF-токена; проверяется только Origin. | | POST | `/api/logout` | Выход. Уничтожает сессию и cookie CSRF. | | GET | `/api/session` | Возвращает `{"actor": "...", "permissions": [...], "csrf_token": "..."}`. Панель вызывает его при старте. | Сессия живёт в подписанной cookie (TTL по умолчанию 12 часов), серверного хранилища сессий нет. Все запросы, кроме `GET/HEAD/OPTIONS` и `/api/login`, обязаны предъявить: - cookie `telesrv_admin_csrf`; - заголовок `X-CSRF-Token` с тем же значением; - Origin, совпадающий с хостом (если Origin присутствует). Нарушение любого из трёх условий — `403 Forbidden`. ## Права и их проверка Панель различает обычную авторизацию (`requireAuthAPI`) и проверку права (`requirePermission`). Имена прав совпадают со строками в `TELESRV_ADMIN_UI_PERMISSIONS`: | Право | Что даёт | | --- | --- | | `*` | Все права (wildcard). | | `premium.manage` | Управление каталогом Premium-планов, начисление Premium. | | `bots.token.read` | Экспорт токена бота (`/api/actions/export-bot-token`). | | `verification.review` | Чтение и решение очереди официальной верификации. | | `verification.revoke` | Снятие официального бейджа (в дополнение к `verification.review`). | | `botverification.review` | Чтение и решение очереди сторонней (ботовой) верификации. | | `botverification.manage` | Назначение верификаторов, редактирование каталога иконок, снятие метки сторонней верификации. | Права официальной и сторонней верификации намеренно независимы. Список прав сессии возвращается в `/api/session`, чтобы интерфейс скрывал недоступные разделы. ## Страницы интерфейса (SPA) SPA-роуты декларативны: любое имя раздела отдаётся сервером как `/` (index.html), а сам фронтенд решает, что рендерить (`web/src/pages/Routes.tsx`). | Путь | Страница | | --- | --- | | `/` | Панель управления (счётчики, статистика хранилища, ссылки на разделы). | | `/accounts` | Список аккаунтов (с поиском). | | `/accounts/{id}` | Карточка аккаунта: профиль, действия. | | `/channels` | Список супергрупп и каналов. | | `/channels/{id}` | Карточка канала. | | `/bots` | Список ботов. | | `/bots/{id}` | Карточка бота. | | `/broadcasts` | Рассылки. | | `/monetization`, `/premium` | Звёзды и Premium: планы, начисление. Требует `premium.manage`. | | `/moderation` | Жалобы и модерация: список кейсов. | | `/moderation/{id}` | Детали кейса модерации. | | `/emoji` | Каталог emoji-наборов. | | `/stickers` | Каталог стикерпаков. | | `/gif-catalog` | Каталог GIF. | | `/messages`, `/messages/private` | Аудит личных сообщений. | | `/messages/detail`, `/messages/private/detail` | Детали личного сообщения (`?owner_user_id=&msg_id=`). | | `/messages/groups` | Аудит сообщений групп/каналов. | | `/messages/groups/detail` | Детали сообщения в группе (`?channel_id=&msg_id=`). | | `/gifts` | Звёздные подарки: каталог, коллекционки, аукционы. | | `/give-gifts` | Выдача подарков. | | `/collectible-usernames` | Коллекционные юзернеймы. | | `/collectible-usernames/{id}` | Карточка коллекционного юзернейма. | | `/collectible-phones` | Анонимные номера. | | `/account-ratings` | Рейтинг аккаунтов. | | `/account-ratings/{user_id}` | Карточка рейтинга аккаунта. | | `/storage` | Объектное хранилище: статистика. | | `/verification` | Официальная верификация: очередь заявок. Требует `verification.review`. | | `/verification/{id}` | Детали заявки на официальную верификацию. Требует `verification.review`. | | `/bot-verification` | Сторонняя верификация: верификаторы, иконки, метки, очередь. Требует `botverification.review`. | | `/bot-verification/{id}` | Детали запроса сторонней верификации. Требует `botverification.review`. | Несуществующий API-путь возвращает `404 {"error":"api route not found"}`; любой неизвестный путь фронтенда отдаётся как `/`. ## Соглашения ответов - Успешные чтения — `200` + JSON; файлы (аватары, анимации, превью) — сам файл. - Ошибки — JSON вида `{"error": "...", "code": "..."}` с соответствующим HTTP-статусом. - `401` — нет/просрочена сессия; `403` — нарушение CSRF/Origin или не хватает права (в `requirePermission` к телу добавляется поле `permission`); `409` — конфликт оптимистичной блокировки (кейс модерации, верификация); `502` — Admin API недоступен. - Ошибки команд, ушедших в Admin API, возвращаются как `{"status": ..., "message": ..., "error": ...}`. ## Общие поля команд (POST `/api/actions/*`) Каждый изменяющий запрос несёт в теле: | Поле | Тип | Описание | | --- | --- | --- | | `command_id` | string | Идемпотентный ключ команды. Повтор с тем же `command_id` не выполняет действие дважды. Если пусто — генерируется сервером. | | `reason` | string | Обязательная причина операции (аудит). | | `confirm` | bool | Подтверждение оператором (`true`). | --- ## API: дашборд и хранилище | Метод | Путь | Описание | | --- | --- | --- | | GET | `/api/dashboard` | Сводка: `counts`, `storage`, при наличии — `host`. | | GET | `/api/storage/stats` | Статистика объектного хранилища. | ## API: аккаунты | Метод | Путь | Параметры / ответ | | --- | --- | --- | | GET | `/api/accounts` | Параметры: `q` (поиск), `before_id` (int64), `before_active_us` (int64, микросекунды), `limit` (int). Ответ: `query`, `limit`, `rows`, `has_more`, `next_before_id`, `next_before_active_us`, `listing`. | | GET | `/api/accounts/{id}` | Карточка аккаунта: профиль, флаги, статистика (проксируется/читается из БД). | | GET | `/api/accounts/{id}/avatar` | Аватар аккаунта (файл). | | GET | `/api/account-ratings` | Параметры: `q`, `min_level` (int), `user_id` (int64), `before_id` (int64), `limit` (int). Ответ: `rows`, `has_more`, `next_before_id`. | | GET | `/api/account-ratings/{user_id}` | Ответ: `rating`, `events`. | ## API: каналы и супергруппы | Метод | Путь | Параметры / ответ | | --- | --- | --- | | GET | `/api/channels` | Параметры: `q`, `before_id` (int64), `before_updated_us` (int64, микросекунды), `limit` (int). Ответ: `query`, `limit`, `rows`, `has_more`, `next_before_id`, `next_before_updated_us`, `listing`. | | GET | `/api/channels/{id}` | Карточка канала. | | GET | `/api/channels/{id}/avatar` | Аватар канала (файл). | ## API: боты и рассылки | Метод | Путь | Параметры / ответ | | --- | --- | --- | | GET | `/api/bots` | Параметры: `q`, `before_id` (int64), `limit` (int). Ответ: `query`, `limit`, `rows`, `has_more`, `next_before_id`, `listing`. | | GET | `/api/bots/{id}` | Карточка бота. | | GET | `/api/broadcasts` | Параметры: `before_id` (int64), `limit` (int). Ответ: `limit`, `rows`, `has_more`, `next_before_id`. | ## API: медиа-каталоги | Метод | Путь | Параметры / ответ | | --- | --- | --- | | GET | `/api/emoji` | Параметры: `q`, `before_id` (int64), `limit` (int). Ответ: `query`, `rows`, `has_more`, `next_before_id`, `listing`. | | GET | `/api/emoji/{id}/animation` | Lottie-анимация emoji (файл). | | GET | `/api/stickers` | Параметр: `kind` (string, фильтр по типу). Ответ: `rows`, `max_items`. | | GET | `/api/stickers/{id}/documents` | Ответ: `document_ids`. | | GET | `/api/stickers/documents/{id}/animation` | Анимация стикера (файл). | | GET | `/api/gif-catalog` | Ответ: проксируется из Admin API (`/v1/gif-catalog`). | | GET | `/api/gif-catalog/documents/{id}/preview` | Превью GIF (файл). | ## API: аудит сообщений | Метод | Путь | Параметры / ответ | | --- | --- | --- | | GET | `/api/messages` | Параметры: `owner_user_id` (int64, обязателен с `peer_id`), `peer_id` (int64), `before_date` (int64), `before_id` (int), `limit` (int). Ответ: `owner_user_id`, `peer_id`, `before_date`, `before_id`, `limit`, `rows`. | | GET | `/api/messages/detail` | Параметры: `owner_user_id` (int64, обяз.), `msg_id` (int, обяз.). Ответ: карточка сообщения. | | GET | `/api/messages/groups` | Параметры: `channel_id` (int64, обяз.), `before_date` (int64), `before_id` (int), `limit` (int). Ответ: `channel_id`, `before_date`, `before_id`, `limit`, `rows`. | | GET | `/api/messages/groups/detail` | Параметры: `channel_id` (int64, обяз.), `msg_id` (int, обяз.). Ответ: карточка сообщения. | ## API: звёздные подарки и коллекционки | Метод | Путь | Параметры / ответ | | --- | --- | --- | | GET | `/api/gifts` | Ответ: `Gifts` (список подарков). | | GET | `/api/auctions` | Ответ: `Auctions` — текущее состояние всех авторских аукционов и запланированных дропов. | | GET | `/api/official-gifts` | Ответ: проксируется из Admin API (`/v1/official-gifts`). | | GET | `/api/official-gifts/{id}/animation` | Анимация официального подарка (файл). | | GET | `/api/gifts/{id}/animation` | Анимация подарка (файл). | | GET | `/api/gifts/{id}/collectibles` | Ответ: проксируется из Admin API (`/v1/gifts/{id}/collectibles`). | | GET | `/api/gifts/{id}/collectibles/{kind}/{attribute_id}/animation` | Анимация атрибута коллекционки (файл). `kind` ∈ {`model`, `pattern`}. | | GET | `/api/collectible-usernames` | Параметры: `status` (`` | `vault` | `owned` | `burned`), `owner_user_id` (int64), `before_id` (int64), `limit` (int), `q`. Ответ: `rows`, `has_more`, `next_before_id`. | | GET | `/api/collectible-usernames/{id}` | Ответ: `asset`, `transfers`. | | GET | `/api/collectible-phones` | Параметры пробрасываются в Admin API как есть (`/v1/collectible-phones?...`). | | GET | `/api/collectible-phones/{id}` | Параметры пробрасываются в Admin API (`/v1/collectible-phones/{id}?...`). | ## API: Premium Все маршруты раздела требуют права `premium.manage` (проверяется и на уровне панели, и на стороне Admin API). | Метод | Путь | Описание | | --- | --- | --- | | GET | `/api/premium/plans` | Каталог Premium-планов (проксируется в Admin API `/v1/premium/plans`). | ## API: модерация Все чтения пробрасывают query-параметры в Admin API как есть (`/v1/moderation/...`). Решения — `POST` (см. ниже). | Метод | Путь | Описание | | --- | --- | --- | | GET | `/api/moderation/cases` | Список кейсов модерации. | | GET | `/api/moderation/cases/{id}` | Кейс модерации. | | GET | `/api/moderation/reports/{id}` | Жалоба. | | POST | `/api/moderation/cases/{id}/claim` | Взять кейс на себя. Тело: общие поля + `version` (int64), `internal_note` (string). | | POST | `/api/moderation/cases/{id}/decide` | Решение по кейсу. Тело: общие поля + `version` (int64), `internal_note` (string). | | POST | `/api/moderation/cases/{id}/appeals/{appeal_id}/review` | Рассмотрение апелляции. Тело: общие поля + `version` (int64), `internal_note` (string). | ## API: официальная верификация Все маршруты требуют права `verification.review`. Чтения идут напрямую из PostgreSQL, решения — всегда через Admin API (журнал команд, статусная машина, оптимистичная блокировка). | Метод | Путь | Параметры / тело | | --- | --- | --- | | GET | `/api/verification/applications` | Параметры: `status`, `target_type`, `reviewer`, `q`, `before_id`, `limit`. Ответ: `rows`, `has_more`, `next_before_id`. | | GET | `/api/verification/applications/{id}` | Ответ: заявка, события, `applicant_controls_target`, `target_verified`. | | GET | `/api/verification/counts` | Счётчики заявок по статусам. | | POST | `/api/verification/applications/{id}/claim` | Тело решения: общие поля + `version` (int64), `internal_note` (string). | | POST | `/api/verification/applications/{id}/approve` | Тело: общие поля + `version` (int64), `internal_note` (string). Выдаёт бейдж. | | POST | `/api/verification/applications/{id}/reject` | Тело: общие поля + `version` (int64), `internal_note` (string). | | POST | `/api/actions/revoke-verification` | Снять бейдж. Требует `verification.review` **и** `verification.revoke`. Тело — см. ниже в разделе действий. | Конфликт «решил другой модератор» возвращается как `409 Conflict`. ## API: сторонняя (ботовая) верификация Отдельный механизм с отдельными таблицами, правами и маршрутами. Чтения и решения очереди требуют `botverification.review`; управление верификаторами, каталогом иконок и снятие меток — `botverification.manage`. | Метод | Путь | Параметры / тело | | --- | --- | --- | | GET | `/api/botverification/verifiers` | Параметры: `enabled_only` (bool), `limit` (int). Ответ: `rows`. | | GET | `/api/botverification/icons` | Параметры: `active_only` (bool), `limit` (int). Ответ: `rows`. | | GET | `/api/botverification/marks` | Параметры: `peer_type`, `verifier_bot_id` (int64), `q`, `before_id` (int64), `limit` (int). Ответ: `rows`, `has_more`, `next_before_id`. | | GET | `/api/botverification/requests` | Параметры: `status`, `peer_type`, `verifier_bot_id` (int64), `q`, `before_id` (int64), `limit` (int). Ответ: `rows`, `has_more`, `next_before_id`. | | GET | `/api/botverification/requests/{id}` | Ответ: `request`, `verifier`, `mark_active`. | | GET | `/api/botverification/counts` | Счётчики запросов по статусам. Ответ: `counts`. | | POST | `/api/botverification/requests/{id}/approve` | Тело решения: общие поля + `version` (int64), `internal_note` (string). | | POST | `/api/botverification/requests/{id}/reject` | Тело: общие поля + `version` (int64), `internal_note` (string). | | POST | `/api/botverification/requests/{id}/revoke` | Тело: общие поля + `version` (int64), `internal_note` (string). | | POST | `/api/actions/grant-bot-verifier` | Назначить бота верификатором. Требует `botverification.manage`. Тело — см. ниже. | | POST | `/api/actions/set-bot-verifier-enabled` | Включить/отключить верификатора. Требует `botverification.manage`. Тело — см. ниже. | | POST | `/api/actions/revoke-bot-verifier` | Лишить бота статуса верификатора. Требует `botverification.manage`. Тело — см. ниже. | | POST | `/api/actions/upsert-verification-icon` | Добавить/изменить иконку в каталоге. Требует `botverification.manage`. Тело — см. ниже. | | POST | `/api/actions/set-verification-icon-active` | Включить/отключить иконку. Требует `botverification.manage`. Тело — см. ниже. | | POST | `/api/actions/revoke-custom-verification` | Снять стороннюю метку. Требует `botverification.manage`. Тело — см. ниже. | --- ## API: действия над аккаунтами Все маршруты — `POST /api/actions/...`, требуют сессию и CSRF. Тело запроса всегда содержит **общие поля команд** (`command_id`, `reason`, `confirm`) плюс поля из таблицы ниже. | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `set-frozen` | `user_id` (int64), `frozen` (bool), `freeze_until` (time, опц.), `freeze_appeal_url` (string, опц.) | — | | `grant-premium` | `user_id` (int64), `months` (int) | `premium.manage` | | `upsert-premium-plan` | `months` (int), `duration_days` (int), `amount_stars` (int64), `fiat_currency` (string), `fiat_amount` (int64), `store_product` (string), `store_quantity` (int), `enabled` (bool), `sort_order` (int), `label` (string), `expected_version` (int64) | `premium.manage` | | `grant-stars` | `user_id` (int64), `amount` (int64) | — | | `set-verified` | `user_id` (int64), `verified` (bool) | — | | `set-account-flags` | `user_id` (int64), `scam` (bool), `fake` (bool) | — | | `set-support` | `user_id` (int64), `support` (bool) | — | | `set-account-username` | `user_id` (int64), `username` (string) | — | | `set-account-profile` | `user_id` (int64), `first_name` (string), `last_name` (string) | — | | `set-account-phone` | `user_id` (int64), `phone` (string) | — | | `set-account-login-email` | `user_id` (int64), `email` (string) | — | | `set-account-avatar` | **multipart**: поле `metadata` (JSON с общими полями + `user_id` (int64)) и файл в поле `file` | — | | `set-account-color` | `user_id` (int64), `for_profile` (bool), `has_color` (bool), `color` (int), `background_emoji_id` (int64) | — | | `set-account-emoji-status` | `user_id` (int64), `document_id` (int64), `until` (int, секунды) | — | | `revoke-sessions` | `user_id` (int64), `hash` (int64, опц.), `keep_hash` (int64, опц.), `revoke_all` (bool) | — | Пример (выдача Premium, как в вопросе выше): ```http POST /api/actions/grant-premium Content-Type: application/json X-CSRF-Token: { "command_id": "grant-premium-001", "reason": "Компенсация за инцидент", "confirm": true, "user_id": 123456789, "months": 12 } ``` ## API: действия над каналами | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `set-channel-flags` | `channel_id` (int64), `scam` (bool), `fake` (bool) | — | | `set-channel-settings` | `channel_id` (int64), `gigagroup` (*bool), `antispam` (*bool), `participants_hidden` (*bool), `noforwards` (*bool), `join_to_send` (*bool), `join_request` (*bool), `slowmode_seconds` (*int) — все опциональные указатели | — | | `set-channel-username` | `channel_id` (int64), `username` (string) | — | | `set-channel-color` | `channel_id` (int64), `for_profile` (bool), `has_color` (bool), `color` (int), `background_emoji_id` (int64) | — | | `set-channel-emoji-status` | `channel_id` (int64), `document_id` (int64), `until` (int) | — | | `set-channel-avatar` | **multipart**: `metadata` (JSON с общими полями + `channel_id` (int64)) и файл `file` | — | | `set-channel-verified` | `channel_id` (int64), `verified` (bool) | — | ## API: действия над ботами | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `create-bot` | `owner_user_id` (int64), `name` (string), `username` (string) | — | | `delete-bot` | `bot_user_id` (int64) | — | | `export-bot-token` | `bot_user_id` (int64) | `bots.token.read` | | `create-broadcast` | `message` (string), `target_mode` (string), `user_ids` ([]int64, опц.) | — | ## API: действия над стикерами и emoji | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `create-sticker-set` | **multipart**: `metadata` (JSON: общие поля + `title`, `short_name`, `kind`, `emoji`, `keywords`) и файл `file` | — | | `rename-sticker-set` | `set_id` (int64), `title` (string) | — | | `add-sticker-to-set` | **multipart**: `metadata` (JSON: общие поля + `set_id` (string), `emoji`, `keywords`) и файл `file` | — | | `remove-sticker-from-set` | `set_id` (int64), `document_id` (int64) | — | | `set-sticker-set-archived` | `set_id` (int64), `archived` (bool) | — | | `set-sticker-set-sort-order` | `set_id` (int64), `sort_order` (int) | — | | `delete-sticker-set` | `set_id` (int64) | — | ## API: действия над GIF-каталогом | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `create-gif-catalog-entry` | **multipart**: `metadata` (JSON: общие поля + `title`) и файл `file` | — | | `set-gif-catalog-enabled` | `id` (int64, передаётся как строка), `enabled` (bool) | — | | `set-gif-catalog-sort-order` | `id` (int64, строка), `sort_order` (int) | — | | `delete-gif-catalog-entry` | `id` (int64, строка) | — | ## API: действия над подарками и коллекционками | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `import-gift` | **multipart**: `metadata` (JSON: общие поля + `gift_id` (int64), `title`, `stars` (int64), `convert_stars` (int64), `enabled` (bool), `sort_order` (int), `auction` (bool), `auction_slug`, `gifts_per_round` (int), `auction_start_date` (int), `auction_round_duration` (int), `availability_total` (int), `locked_until_date` (int)) и файл `file` | — | | `import-official-gift` | общие поля + `source_gift_id` (string), `gift_id` (int64), `title`, `stars` (int64), `convert_stars` (int64), `enabled` (bool), `sort_order` (int), `include_collectible` (bool), `upgrade_stars` (int64), `supply_total` (int), `slug_prefix` (string), `locked_until_date` (int) | — | | `publish-gift-collectibles` | **multipart**, `gift_id` передаётся в query (`?gift_id=`): `metadata` (JSON: общие поля + `upgrade_stars` (int64), `supply_total` (int), `slug_prefix` (string), `models` ([]объект), `patterns` ([]объект), `backdrops` ([]объект)); анимации — файлы по ключам из `models`/`patterns` | — | | `set-gift-enabled` | `gift_id` (int64), `enabled` (bool) | — | | `set-gift-sort-order` | `gift_id` (int64), `sort_order` (int) | — | | `give-gift` | общие поля + `sender_user_id` (int64), `user_id` (int64), `channel_id` (int64), `gift_id` (int64), `hide_name` (bool), `message` (string), `upgrade` (bool), `model_attribute_id` (int64), `pattern_attribute_id` (int64), `backdrop_attribute_id` (int64) | — | ## API: действия над коллекционными юзернеймами | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `mint-collectible-username` | `username` (string), `owner_user_id` (int64), `owner_channel_id` (int64), `currency` (string), `amount` (int64), `crypto_currency` (string), `crypto_amount` (int64), `url` (string), `purchase_date` (int/unix или дата) | — | | `transfer-collectible-username` | `username` (string), `to_user_id` (int64), `to_channel_id` (int64) | — | | `revoke-collectible-username` | `username` (string), `burn` (bool) | — | | `delete-collectible-username` | `username` (string) | — | ## API: действия над анонимными номерами | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `mint-collectible-phone` | `phone` (string), `tier` (string), `owner_user_id` (int64), `currency` (string), `amount` (int64), `crypto_currency` (string), `crypto_amount` (int64), `url` (string), `purchase_date` (int/unix или дата) | — | | `update-collectible-phone-price` | `phone` (string), `currency` (string), `amount` (int64), `crypto_currency` (string), `crypto_amount` (int64) | — | | `transfer-collectible-phone` | `phone` (string), `to_user_id` (int64) | — | | `revoke-collectible-phone` | `phone` (string), `burn` (bool) | — | | `delete-collectible-phone` | `phone` (string) | — | ## API: действия над рейтингом аккаунтов | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `recompute-account-rating` | `user_id` (int64) | — | | `adjust-account-rating` | `user_id` (int64), `amount` (int64) | — | ## API: удаление сообщений | Путь | Специфичные поля тела | Право | | --- | --- | --- | | `delete-messages` | `owner_user_id` (int64), `peer_id` (int64), `ids` ([]int), `revoke` (bool) | — | | `delete-history` | `owner_user_id` (int64), `peer_id` (int64), `max_id` (int), `min_date` (int), `max_date` (int), `max_batches` (int), `just_clear` (bool), `revoke` (bool) | — | ## API: решения верификации (тела запросов) Официальная верификация — `revoke-verification`: | Поле | Тип | Описание | | --- | --- | --- | | `target_type` | string | Тип цели (`user` / `channel` и т.п., валидируется `domain.VerificationTargetType.Valid()`). | | `target_id` | int64 | Идентификатор цели (не заявки!). | | `internal_note` | string | Внутренняя заметка оператора (опц.). | | + общие поля | | `command_id`, `reason`, `confirm`. | Сторонняя верификация — действия верификатора/меток (`botverification.manage`): | Путь | Специфичные поля тела | | --- | --- | | `grant-bot-verifier` | `bot_id` (int64), `icon_document_id` (int64), `company_name` (string, обяз.), `default_description` (string), `can_modify_custom_description` (bool), `version` (int64, 0 для нового) | | `set-bot-verifier-enabled` | `bot_id` (int64), `enabled` (bool) | | `revoke-bot-verifier` | `bot_id` (int64) | | `upsert-verification-icon` | `document_id` (int64), `name` (string, обяз.), `owner_bot_id` (int64, опц., 0 = общая) | | `set-verification-icon-active` | `icon_id` (int64), `active` (bool) | | `revoke-custom-verification` | `verifier_bot_id` (int64), `peer_type` (string, валидируется), `peer_id` (int64) | Все они также несут общие поля (`command_id`, `reason`, `confirm`).