TGProxy Panel

API TGProxy Panel: токены, права и примеры

Автоматизация своей TGProxy Panel через персональные Bearer-токены: права, примеры curl и Python, пагинация, ошибки и спецификация OpenAPI.

Обновлено 8 октября 2026 · Документация открытого проекта

API управления позволяет автоматизировать свою панель через скрипты, ботов и интеграции. Пользователи в API называются ключами: раздел «Пользователи» соответствует /api/v1/keys.

Создайте персональный API-токен

Войдите в свою панель и откройте «Настройки» → «API-токены». Укажите имя, срок действия и права, необходимые интеграции. Срок по умолчанию — 30 дней; можно выбрать целое число от 1 до 365 дней. У каждой учётной записи может быть до 50 действующих токенов. Наблюдатели могут создавать токены только для чтения.

Скопируйте секрет tgwp_… до закрытия окна создания: он показывается только один раз. Панель хранит его хеш SHA-256 и открытый префикс, поэтому восстановить секрет из списка токенов нельзя. Храните его в хранилище секретов интеграции или переменной окружения; не добавляйте в исходный код, логи и общедоступные снимки экрана.

Отправляйте запросы по HTTPS на адрес своей установленной панели, например https://panel.example.com/api/v1. На tgproxypanel.com находится документация, а не API управления вашей панелью.

Передавайте один заголовок Authorization: Bearer <токен>. После проверки персонального Bearer-токена cookie и X-CSRF-Token не нужны. Некорректный или повторяющийся заголовок Authorization не заменяется авторизацией через браузерный сеанс. Поддержка токенов не меняет политику CORS панели; эти примеры запускаются на сервере или в командной строке.

Отзовите ненужный токен в «Настройки» → «API-токены». Просроченные и отозванные токены перестают работать. Смена пароля отзывает все ваши персональные токены; удаление учётной записи делает её токены недействительными. Список показывает срок действия и последнее использование; время использования обновляется не чаще раза в минуту.

Права токена и роль учётной записи

Каждый запрос должны разрешать и права токена, и текущая роль учётной записи. Права записи не включают права чтения автоматически. Изменение роли действует на последующие запросы. Наборы «Только чтение» и «Полные права» выбирают разрешения; полные права всё равно ограничены ролью учётной записи и каталогом методов ниже.

РесурсРазрешенияЧто входит
nodesnodes:read
nodes:write
Серверы, настройки, установка и применение
usersusers:read
users:write
Пользователи, привязки и ссылки подписки; адреса используют /keys
monitoringmonitoring:read
monitoring:write
Обзор, мониторинг и оповещения
sitessites:read
sites:write
Сайты-прикрытия
brandingbranding:read
branding:write
Оформление панели и страниц подписки
settingssettings:read
settings:write
Настройки автоматизации в пределах роли учётной записи
auditaudit:readЖурнал действий

Чтение чувствительных данных требует права записи даже для метода GET: это секреты пользователей, ссылки прокси и QR-коды, команды установки серверов и секреты регистрации. Право чтения не даёт доступа к этим значениям. Нужное разрешение для каждого адреса указано в каталоге.

Создание, просмотр и отзыв токенов, управление учётными записями, смена пароля и 2FA, резервные копии и реквизиты сервиса страниц подписки требуют браузерного сеанса. Персональный токен не может выпустить другой токен или управлять этими операциями. Токены агентов, внешних проверок, метрик и сервиса подписки имеют отдельное назначение и не заменяются персональным токеном.

В журнале изменений идентификатор персонального токена записывается в api_token_id: это позволяет узнать, какая интеграция внесла изменение, не сохраняя секрет в журнале.

curl: чтение сервера и управление пользователями

Замените адрес и UUID на значения из своей панели. Загрузите токен из хранилища секретов; значение ниже — пример для замены. Чтение сервера и списка пользователей требует nodes:read и users:read. Создание, приостановка и возобновление доступа требуют users:write и роли владельца или администратора.

Задайте параметры подключения

export TGWP_PANEL_URL='https://panel.example.com'
export TGWP_API_TOKEN='tgwp_replace_with_your_token'
export TGWP_NODE_ID='replace-with-node-uuid'
export TGWP_KEY_ID='replace-with-user-uuid'

Прочитайте сервер и список активных пользователей

curl --fail-with-body --silent --show-error \
  -H "Authorization: Bearer $TGWP_API_TOKEN" \
  "$TGWP_PANEL_URL/api/v1/nodes/$TGWP_NODE_ID"

curl --fail-with-body --silent --show-error \
  -H "Authorization: Bearer $TGWP_API_TOKEN" \
  "$TGWP_PANEL_URL/api/v1/keys?state=active&page=1&per_page=50"

Создайте личный доступ

curl --fail-with-body --silent --show-error \
  -X POST "$TGWP_PANEL_URL/api/v1/keys" \
  -H "Authorization: Bearer $TGWP_API_TOKEN" \
  -H 'Content-Type: application/json' \
  --data "{\"label\":\"Automation example\",\"type\":\"PERSONAL\",\"node_ids\":[\"$TGWP_NODE_ID\"],\"expires_at\":null}"

Обязательны label, type и хотя бы один UUID в node_ids. Тип задаётся в верхнем регистре: PERSONAL или SHARED. expires_at: null означает отсутствие срока доступа пользователя; для ограничения укажите будущую дату в формате RFC 3339. Это отдельный срок, не срок действия API-токена. Ответ — HTTP 201 с объектом пользователя; скопируйте его id в TGWP_KEY_ID. Ответ создания может содержать секреты и ссылки пользователя: сохраняйте их конфиденциально.

Приостановите и возобновите доступ

curl --fail-with-body --silent --show-error \
  -X POST -H "Authorization: Bearer $TGWP_API_TOKEN" \
  "$TGWP_PANEL_URL/api/v1/keys/$TGWP_KEY_ID/disable"

curl --fail-with-body --silent --show-error \
  -X POST -H "Authorization: Bearer $TGWP_API_TOKEN" \
  "$TGWP_PANEL_URL/api/v1/keys/$TGWP_KEY_ID/enable"

Оба запроса возвращают HTTP 200 с обновлённым пользователем. После этих примеров доступ включён. Возобновление не продлевает истёкший срок и не отменяет отзыв доступа.

Python без внешних библиотек

Скрипт использует те же переменные окружения и права, что и примеры curl. Он читает сервер, проходит по страницам активных пользователей, затем создаёт пользователя с доступом на семь дней, приостанавливает и возобновляет его доступ. Сохраните код в example.py и запустите python3 example.py. Скрипт печатает идентификаторы и состояние вместо полного ответа создания.

import json
import os
from datetime import datetime, timedelta, timezone
from urllib.error import HTTPError
from urllib.parse import urlencode
from urllib.request import Request, urlopen

base = os.environ["TGWP_PANEL_URL"].rstrip("/") + "/api/v1"
token = os.environ["TGWP_API_TOKEN"]
node_id = os.environ["TGWP_NODE_ID"]
if not base.startswith("https://"):
    raise ValueError("Use the HTTPS address of your own panel")

def api(method, path, body=None):
    headers = {"Authorization": "Bearer " + token}
    data = None
    if body is not None:
        headers["Content-Type"] = "application/json"
        data = json.dumps(body).encode("utf-8")
    req = Request(base + path, data=data, headers=headers, method=method)
    try:
        with urlopen(req, timeout=30) as response:
            raw = response.read()
            return json.loads(raw) if raw else None
    except HTTPError as exc:
        raw = exc.read()
        try:
            error = json.loads(raw).get("error", {})
        except (ValueError, AttributeError):
            error = {"code": "http_error", "message": "Non-JSON response"}
        raise RuntimeError(
            f"HTTP {exc.code}: {error.get('code')}: "
            f"{error.get('message')}; fields={error.get('fields', {})}"
        ) from None

node = api("GET", "/nodes/" + node_id)
print(node["name"], node["status"])
page = 1
while True:
    result = api("GET", "/keys?" + urlencode({
        "state": "active", "page": page, "per_page": 50
    }))
    for user in result["items"]:
        print(user["id"], user["label"], user["state"])
    if not result["items"] or page * result["per_page"] >= result["total"]:
        break
    page += 1

expires = datetime.now(timezone.utc) + timedelta(days=7)
user = api("POST", "/keys", {
    "label": "Automation example", "type": "PERSONAL",
    "node_ids": [node_id], "expires_at": expires.isoformat()
})
print("Created user:", user["id"])
api("POST", "/keys/" + user["id"] + "/disable")
api("POST", "/keys/" + user["id"] + "/enable")

Списки, фильтры и пагинация

Ответы списков содержат items; параметры пагинации зависят от конкретного метода.

Адрес / параметрПоведение
/keys: pageНачиная с 1; по умолчанию 1.
/keys: per_page1–200; по умолчанию 50. Значения вне диапазона заменяются на 50.
/keys: qПерсональные токены без users:write ищут только по label, owner_label и note; скрытые короткие адреса подписки исключены. Токены с users:write и браузерные сеансы также ищут по коротким адресам подписки.
/keys: typePERSONAL или SHARED.
/keys: statusСостояние в базе: pending, active или revoked.
/keys: stateactive, pending, expiring, expired, disabled или revoked. expiring — срок истекает в ближайшие семь дней.
/keys: nodeФильтр по UUID сервера; параметр называется node, не node_id.
/nodesВозвращает {items, total}; параметров page и per_page нет.
/nodes/{id}/jobs: limit1–100; по умолчанию 20. Значения вне диапазона заменяются на 20.

GET /keys возвращает {items, total, page, per_page}. Запрашивайте страницы до достижения total или пустого массива items. Список может измениться во время обхода; не меняйте отфильтрованных пользователей посреди чтения страниц.

Применение изменений и повтор запросов

Создание и изменение пользователя ставит изменения конфигурации его серверов в очередь; успешный HTTP-ответ ещё не означает, что прокси их применил. Проверяйте nodes[].profile_sync пользователя, поля dirty, last_apply_at сервера и GET /nodes/{id}/jobs. История заданий требует nodes:write, поскольку содержит исходные логи и ошибки. У заданий есть status, started_at, finished_at и error; состояния — queued, running, ok, failed и rolled_back.

POST /nodes/{id}/apply требует nodes:write и отвечает HTTP 202 с {"queued": true}. Идентификатор задания в ответе отсутствует. Проверяйте сервер и последние задания с разумным интервалом, например пять секунд, и общим ограничением времени. При ошибке задания изучите её причину: повторная постановка в очередь сама по себе её не объяснит.

Ограничивайте время запроса. Повторяйте чтение после временных сетевых или серверных ошибок с ограниченной задержкой. Не повторяйте вслепую создание пользователей, смену секретов и другие изменения: потерянный ответ может следовать за успешной операцией. Сначала проверьте результат, чтобы избежать дубликатов или нежелательных изменений.

HTTP-статусы и ответы об ошибках

Успешный ответ может содержать JSON или другой описанный формат, например PNG или текст Prometheus. У HTTP 204 тела ответа нет. Ошибки используют такой JSON; fields присутствует при ошибках проверки полей:

{
  "error": {
    "code": "validation",
    "message": "invalid input",
    "fields": {
      "node_ids": "bind at least one node"
    }
  }
}
СтатусЗначение
200 / 201 / 202 / 204Чтение или изменение успешно / ресурс создан / поставлено в очередь / успех без тела ответа.
400Некорректный запрос или JSON; неизвестные поля JSON отклоняются.
401Нет реквизитов доступа, либо они неверны, просрочены или отозваны.
403Права токена, текущая роль или требование браузерного сеанса запрещают операцию.
404Ресурс отсутствует или идентификатор недоступен вызывающему.
409Конфликт с текущим состоянием; перечитайте ресурс перед изменением.
422Ошибка проверки данных; смотрите error.fields.
500 / 502 / 503Внутренняя ошибка, сбой операции на сервере или сервер не в сети; проверьте код ошибки и состояние.

Каталог методов и разрешений

Каждый адрес ниже отсчитывается от домена вашей панели и включает /api/v1. Каталог и спецификация OpenAPI 3.0.3 для скачивания формируются из явной политики доступа персональных токенов в серверном коде. Адреса вне каталога недоступны персональным токенам. Ограничение «только владелец» действует дополнительно к разрешениям.

Серверы

МетодМаршрутРазрешениеОперация
GET/api/v1/fleet/updatesnodes:writeПолучить список обновлений серверов
POST/api/v1/fleet/updatesnodes:writeЗапустить обновление нескольких серверов
POST/api/v1/fleet/updates/{id}/stopnodes:writeОстановить обновление нескольких серверов
GET/api/v1/nodesnodes:readПолучить список серверов
POST/api/v1/nodesnodes:writeСоздать сервер
PUT/api/v1/nodes/ordernodes:writeИзменить порядок серверов
POST/api/v1/nodes/preflight/dnsnodes:writeПроверить DNS сервера
DELETE/api/v1/nodes/{id}nodes:writeУдалить сервер
GET/api/v1/nodes/{id}nodes:readПолучить данные сервера
PATCH/api/v1/nodes/{id}nodes:writeИзменить настройки сервера
POST/api/v1/nodes/{id}/applynodes:writeПрименить конфигурацию сервера
GET/api/v1/nodes/{id}/blocklistnodes:readПолучить список блокировок сервера
PUT/api/v1/nodes/{id}/blocklistnodes:writeИзменить список блокировок сервера
POST/api/v1/nodes/{id}/checknodes:writeПроверить сервер
GET/api/v1/nodes/{id}/diagnosticsnodes:writeПолучить историю диагностики сервера
POST/api/v1/nodes/{id}/diagnostics/webnodes:writeЗапустить диагностику WEB-транспорта сервера
GET/api/v1/nodes/{id}/healthnodes:readПолучить данные о состоянии сервера
GET/api/v1/nodes/{id}/install-commandnodes:writeВыдать команду установки сервера
GET/api/v1/nodes/{id}/jobsnodes:writeПолучить историю применения конфигурации сервера
GET/api/v1/nodes/{id}/logsnodes:writeПолучить поток логов сервера
GET/api/v1/nodes/{id}/metricsnodes:readПолучить метрики сервера
GET/api/v1/nodes/{id}/probesnodes:readПолучить результаты внешних проверок сервера
GET/api/v1/nodes/{id}/profilesnodes:readПолучить список профилей доступа сервера
GET/api/v1/nodes/{id}/registration-secretnodes:writeПолучить секрет регистрации сервера
GET/api/v1/nodes/{id}/reliabilitynodes:readПолучить данные об отказоустойчивости сервера
PUT/api/v1/nodes/{id}/reliabilitynodes:writeИзменить настройки отказоустойчивости сервера
POST/api/v1/nodes/{id}/restartnodes:writeПерезапустить прокси на сервере
GET/api/v1/nodes/{id}/statsnodes:readПолучить статистику сервера
GET/api/v1/nodes/{id}/telemt-updatenodes:writeПолучить историю обновлений сервера
POST/api/v1/nodes/{id}/telemt-updatenodes:writeОбновить telemt на сервере
GET/api/v1/nodes/{id}/web-policynodes:readПолучить настройки WEB-транспорта сервера
PUT/api/v1/nodes/{id}/web-policynodes:writeИзменить настройки WEB-транспорта сервера
GET/api/v1/nodes/{id}/web/carriersnodes:readПолучить данные о каналах WEB-транспорта сервера
POST/api/v1/nodes/{id}/web/lifecyclenodes:writeУправлять состоянием WEB-транспорта сервера
GET/api/v1/status/updatenodes:readПолучить результат проверки обновлений панели

Пользователи

МетодМаршрутРазрешениеОперация
GET/api/v1/keysusers:readПолучить список пользователей
POST/api/v1/keysusers:writeСоздать пользователя
POST/api/v1/keys/batchusers:writeСоздать несколько пользователей
POST/api/v1/keys/bulkusers:writeВыполнить действие для нескольких пользователей
POST/api/v1/keys/importusers:writeИмпортировать пользователей
GET/api/v1/keys/summaryusers:readПолучить сводку по пользователям
DELETE/api/v1/keys/{id}users:writeУдалить пользователя
GET/api/v1/keys/{id}users:readПолучить данные пользователя
PATCH/api/v1/keys/{id}users:writeИзменить пользователя
POST/api/v1/keys/{id}/bindingsusers:writeПривязать пользователя к серверу
DELETE/api/v1/keys/{id}/bindings/{node}users:writeОтвязать пользователя от сервера
POST/api/v1/keys/{id}/disableusers:writeПриостановить доступ пользователя
POST/api/v1/keys/{id}/enableusers:writeВозобновить доступ пользователя
GET/api/v1/keys/{id}/linksusers:writeПолучить ссылки прокси пользователя
GET/api/v1/keys/{id}/presenceusers:readПолучить людей онлайн у пользователя
GET/api/v1/keys/{id}/qrusers:writeПолучить QR-код ссылки прокси пользователя
POST/api/v1/keys/{id}/revokeusers:writeОтозвать доступ пользователя
POST/api/v1/keys/{id}/rotateusers:writeСменить секрет пользователя
GET/api/v1/keys/{id}/statsusers:readПолучить статистику пользователя
DELETE/api/v1/keys/{id}/subscriptionusers:writeОтозвать ссылку подписки пользователя
POST/api/v1/keys/{id}/subscriptionusers:writeВыдать ссылку подписки пользователю
GET/api/v1/keys/{id}/subscription/qrusers:writeПолучить QR-код подписки пользователя

Мониторинг

МетодМаршрутРазрешениеОперация
GET/api/v1/alertsmonitoring:readПолучить список оповещений
POST/api/v1/alerts/resolvemonitoring:writeОтметить оповещения прочитанными
POST/api/v1/alerts/{id}/resolvemonitoring:writeОтметить оповещение прочитанным
GET/api/v1/dashboard/summarymonitoring:readПолучить сводку для главной страницы
GET/api/v1/dashboard/trendsmonitoring:readПолучить динамику показателей главной страницы
GET/api/v1/monitoring/nodes/{id}/seriesmonitoring:readПолучить временные ряды мониторинга сервера
GET/api/v1/monitoring/overviewmonitoring:readПолучить сводные данные мониторинга
GET/api/v1/monitoring/web/carriersmonitoring:readПолучить данные о каналах WEB-транспорта всех серверов
GET/api/v1/status/publicmonitoring:readПолучить краткую сводку состояния панели

Сайты

МетодМаршрутРазрешениеОперация
GET/api/v1/nodes/{id}/sitesites:readПолучить данные сайта сервера
POST/api/v1/nodes/{id}/sitesites:writeНазначить сайт серверу
GET/api/v1/nodes/{id}/site/previewsites:readОткрыть предпросмотр сайта сервера
POST/api/v1/nodes/{id}/site/upstreamsites:writeНазначить серверу сайт с локального веб-сервиса
GET/api/v1/site-templatessites:readПолучить список шаблонов сайтов
POST/api/v1/site-templatessites:writeСоздать шаблон сайта
POST/api/v1/site-templates/importsites:writeИмпортировать шаблон сайта
POST/api/v1/site-templates/validatesites:writeПроверить шаблон сайта
DELETE/api/v1/site-templates/{id}sites:writeУдалить шаблон сайта
GET/api/v1/site-templates/{id}sites:readПолучить шаблон сайта
PUT/api/v1/site-templates/{id}sites:writeИзменить шаблон сайта
POST/api/v1/site-templates/{id}/customizesites:writeСоздать сайт из шаблона с заданными параметрами

Оформление

МетодМаршрутРазрешениеОперация
GET/api/v1/branding/profilesbranding:readПолучить список профилей оформления
POST/api/v1/branding/profilesbranding:writeСоздать профиль оформления
DELETE/api/v1/branding/profiles/{id}branding:writeУдалить профиль оформления
PUT/api/v1/branding/profiles/{id}branding:writeИзменить профиль оформления
POST/api/v1/branding/profiles/{id}/activatebranding:writeАктивировать профиль оформления
POST/api/v1/branding/profiles/{id}/uploadbranding:writeЗагрузить файл оформления

Настройки

МетодМаршрутРазрешениеОперация
GET/api/v1/settingssettings:readПолучить настройки панели
PUT/api/v1/settingssettings:write
Только владелец
Изменить настройки панели
GET/api/v1/settings/subscription-page/previewsettings:readОткрыть предпросмотр страницы подписки
POST/api/v1/settings/telegram/testsettings:write
Только владелец
Отправить тестовое оповещение в Telegram

Аудит

МетодМаршрутРазрешениеОперация
GET/api/v1/auditaudit:readПолучить записи журнала действий

Для установки откройте руководство по панели и telemt. В руководстве API в репозитории также описано управление токенами через браузерный сеанс.