API awg‑manager

Полная справка по REST API awg‑manager. Описаны все эндпоинты, аутентификация, форматы запросов и ответов. Для общего знакомства смотрите Быстрый старт, а примеры использования конкретных функций — Руководство.

Общие сведения

  • Базовый URL: http://<router-ip>:<port>/api (порт по умолчанию 2222, выбирается динамически)
  • Аутентификация: сессионная cookie awg_session. Большинство эндпоинтов требуют валидной сессии. Публичные (без аутентификации):
    /auth/login, /auth/logout, /auth/status, /health, /hook/ndms, /dns-check/probe, /boot-status
  • Формат ответа (успех):
    { "success": true, "data": { ... } }
  • Формат ответа (ошибка):
    { "success": false, "error": "сообщение", "code": "ERROR_CODE" }
  • Коды ошибок (неполный список):
    • METHOD_NOT_ALLOWED — неверный HTTP метод
    • MISSING_NAME, MISSING_ID, MISSING_MAC и т.п.
    • INVALID_NAME, INVALID_ID, INVALID_JSON
    • NOT_FOUND — ресурс не найден
    • UNAUTHORIZED — требуется аутентификация
    • AUTH_FAILED — неверные учётные данные
    • ROUTER_UNAVAILABLE — нет связи с роутером
    • CREATE_FAILED, UPDATE_FAILED, DELETE_FAILED, LIST_FAILED
    • INTERNAL_ERROR — внутренняя ошибка сервера
Эндпоинты, возвращающие 405 Method Not Allowed, могут использовать сокращённый формат { "error": true, "message": "...", "code": "METHOD_NOT_ALLOWED" }. Клиентам следует обрабатывать оба варианта.

Аутентификация

МетодПутьОписаниеДоступ
POST/auth/loginВход (устанавливает cookie awg_session)public
POST/auth/logoutВыход (удаляет cookie)public (требует наличия cookie)
GET/auth/statusСтатус текущей сессииpublic (с cookie)

POST /auth/login

Тело:

{ "login": "admin", "password": "secret" }

Успех (200): { "success": true, "login": "admin" }
Ошибки:

  • AUTH_FAILED (401) – неверный логин/пароль
  • ROUTER_UNAVAILABLE (503) – роутер недоступен

GET /auth/status

Успех (200):
Если аутентификация включена и сессия валидна:

{ "authenticated": true, "login": "admin", "expiresIn": 3540 }

Если сессии нет:

{ "authenticated": false }

Если аутентификация отключена глобально (в настройках):

{ "authenticated": true, "authDisabled": true }

POST /auth/logout

Успех (200): { "success": true }

Health и boot

МетодПутьОписаниеДоступ
GET/healthПроверка живости сервера, возвращает версиюpublic
GET/boot-statusСтатус инициализации (instanceId, phase)public

GET /health

{ "success": true, "data": { "ok": true, "version": "2.8.0" } }

GET /boot-status

{
  "initializing": false,
  "remainingSeconds": 0,
  "phase": "ready",
  "instanceId": "a1b2c3..."
}

Система

МетодПутьОписаниеАутентификация
GET/system/infoПолная информация о системе, прошивке, бэкендахда
POST/system/restartПерезапуск демона awg‑manager (с задержкой)да
GET/system/wan-interfacesСписок WAN‑интерфейсов (ядро)да
GET/system/all-interfacesВсе сетевые интерфейсы роутера (через NDMS)да
GET/system/hydraroute-statusСтатус установки HydraRoute Neoда
POST/system/hydraroute-controlУправление HydraRoute (start/stop/restart)да

GET /system/info

Возвращает объект (пример):

{
  "version": "2.8.0",
  "goVersion": "go1.22.0",
  "goArch": "arm",
  "keeneticOS": "KeeneticOS 5.0",
  "isOS5": true,
  "firmwareVersion": "5.0.1",
  "supportsExtendedASC": true,
  "supportsHRanges": true,
  "supportsPingCheck": true,
  "totalMemoryMB": 1024,
  "isLowMemory": false,
  "gcMemLimit": "512MiB",
  "gogc": "100",
  "disableMemorySaving": false,
  "kernelModuleExists": true,
  "kernelModuleLoaded": true,
  "kernelModuleModel": "MT7621",
  "kernelModuleVersion": "1.0",
  "isAarch64": false,
  "activeBackend": "kernel",
  "routerIP": "192.168.1.1",
  "bootInProgress": false,
  "backendAvailability": {
    "nativewg": true,
    "kernel": true
  },
  "singbox": {
    "installed": true,
    "version": "v1.8.0"
  }
}

GET /system/wan-interfaces

[
  { "name": "ppp0", "label": "PPPoE", "state": "up" },
  { "name": "eth3", "label": "WAN", "state": "down" }
]

GET /system/all-interfaces

Массив интерфейсов с полями name, label, type и т.д. (зависит от NDMS).

POST /system/hydraroute-control

Тело: { "action": "start" | "stop" | "restart" }
Ответ: статус после выполнения (как в GET /system/hydraroute-status).

Настройки приложения

МетодПутьОписаниеАутентификация
GET/settings/getПолучить все настройки (порт, auth, etc.)да
POST/settings/updateСохранить настройки (полный объект)да

Пример ответа GET /settings/get:

{
  "port": 2222,
  "authEnabled": true,
  "sessionTTLSeconds": 3600,
  "disableMemorySaving": false,
  "serverInterfaces": ["Wireguard0"],
  "hiddenSystemTunnels": ["Wireguard2"],
  "managedServer": { ... }
}

При обновлении передаётся аналогичный объект.

Обновления

МетодПутьОписаниеАутентификация
GET/system/update/checkПроверить наличие новой версии (кеш)да
GET/system/update/check?force=trueПринудительная проверкада
POST/system/update/applyЗапустить обновление через opkgда
GET/system/update/changelogПолучить список изменений (от from до to)да

GET /system/update/changelog

Параметры:

  • from (опционально) – версия, начиная с которой показывать изменения
  • to (обязательно) – целевая версия

Если from не указан, возвращается запись для версии to.
Ответ: { "entries": [ { "version": "2.8.0", "changes": [...] } ] }

NDMS save‑status

МетодПутьОписаниеАутентификация
GET/ndms/save-statusТекущее состояние debounced‑сохранения конфигурациида

Ответ:

{
  "state": "idle",      // idle, pending, saving, error, failed
  "lastError": "",
  "lastSaveAt": "2025-01-01T12:00:00Z",
  "pendingCount": 0
}

VPN‑серверы (WireGuard Server Interfaces)

МетодПутьОписаниеАутентификация
GET/serversКраткий список серверных интерфейсов (с фильтрацией)да
GET/servers/allПолный снимок: серверы + managed + WAN IPда
GET/servers/get?name=Детали одного сервера со списком пировда
GET/servers/config?name=Конфигурация в формате RC для генерации .confда
POST/servers/mark?name=Отметить интерфейс как серверда
DELETE/servers/mark?name=Снять отметку (вернуть в системные туннели)да
GET/servers/wan-ipВнешний WAN IP роутерада
GET/servers/markedСписок ID отмеченных серверных интерфейсовда

Примечание: Имя должно соответствовать шаблону WireguardN (N – число).
POST/DELETE /servers/mark возвращают свежий ServersSnapshot (как /servers/all).
Структура /servers/all:

{
  "servers": [...],
  "managed": { ... },        // если создан managed‑сервер
  "managedStats": { ... },   // статистика пиров managed
  "wanIP": "123.45.67.89"
}

Управляемый WireGuard‑сервер

МетодПутьОписаниеАутентификация
GET/managed-serverТекущая конфигурация сервера (или null)да
GET/managed-server/statsСтатистика пиров (rx/tx, handshake)да
POST/managed-server/createСоздать сервер (задаёт интерфейс)да
PUT/managed-server/updateИзменить адрес/портда
DELETE/managed-server/deleteУдалить сервер и всех пировда
POST/managed-server/peersДобавить пирада
PUT/managed-server/peers/update?pubkey=Обновить пирада
DELETE/managed-server/peers?pubkey=Удалить пирада
POST/managed-server/peers/toggleВкл/выкл пирада
GET/managed-server/peers/conf?pubkey=Сгенерировать .conf для пирада
POST/managed-server/policyУстановить политику доступа для интерфейсада
GET/managed-server/policiesСписок доступных политик (IP Policy)да
POST/managed-server/natВключить/отключить NAT на интерфейседа
POST/managed-server/enabledВключить/отключить интерфейсда
GET/managed-server/ascПолучить ASC‑параметры (AmneziaWG)да
POST/managed-server/ascУстановить ASC‑параметры (raw JSON)да
GET/managed-server/suggest-addressПредложить свободную частную подсеть /24да

Пример создания:

{
  "address": "10.10.0.1",
  "mask": "24",
  "listenPort": 51820,
  "interfaceName": "Wireguard5"   // опционально
}

ASC‑параметры (ответ):

{
  "i1": 0, "i2": 0, "i3": 0, "i4": 0, "i5": 0,
  "jc": 0, "jmin": 0, "jmax": 0,
  "s1": 0, "s2": 0, "s3": 0, "s4": 0,
  "h1": 0, "h2": 0, "h3": 0, "h4": 0
}

Туннели (управляемые)

МетодПутьОписаниеАутентификация
GET/tunnels/listСписок всех туннелей (сокращённый)да
GET/tunnels/allСоставной снимок (туннели + external + system)да
GET/tunnels/get?id=Детали одного туннеляда
POST/tunnels/createСоздать туннельда
POST/tunnels/update?id=Обновить туннельда
POST/tunnels/delete?id=Удалить туннельда
GET`/tunnels/traffic?id=&period=1h24h`История трафика (точки + статистика)
GET/tunnels/export?id=Скачать конфиг .confда
GET/tunnels/export-allСкачать все конфиги ZIP‑архивомда
POST/tunnels/replaceЗаменить конфигурацию из нового .confда
POST/import/confИмпорт из конфига (имя, backend)да

GET /tunnels/list – ответ

[
  {
    "id": "my-tunnel",
    "name": "My Tunnel",
    "type": "awg",
    "status": "running",
    "enabled": true,
    "defaultRoute": false,
    "ispInterface": "ppp0",
    "ispInterfaceLabel": "PPPoE",
    "resolvedIspInterface": "ppp0",
    "resolvedIspInterfaceLabel": "PPPoE",
    "endpoint": "1.2.3.4:51820",
    "address": "10.0.0.2/24",
    "interfaceName": "awg0",
    "ndmsName": "Wireguard3",
    "hasAddressConflict": false,
    "rxBytes": 1234567,
    "txBytes": 9876543,
    "lastHandshake": "2025-01-01T12:00:00Z",
    "backend": "kernel",
    "backendType": "AmneziaWG",
    "awgVersion": "amneziawg",
    "mtu": 1420,
    "startedAt": "2025-01-01T11:00:00Z",
    "pingCheck": { "status": "alive", "enabled": true, "method": "icmp" }
  }
]

GET /tunnels/all – ответ

{
  "tunnels": [ ... ],   // те же элементы, что в /tunnels/list
  "external": [ ... ],  // внешние туннели (см. раздел "Внешние туннели")
  "system": [ ... ]     // системные туннели (см. раздел "Системные туннели")
}

POST /tunnels/create

Тело – объект AWGTunnel (минимально: name, interface, peer). ID генерируется автоматически. Ответ: созданный туннель (как в GET /tunnels/get).

POST /tunnels/update?id=

Тело – частичное обновление (только изменяемые поля).
Ответ: обновлённый туннель + поле warnings (при конфликтах адресов).

POST /tunnels/replace?id=

{ "content": "новый конфиг", "name": "новое имя" }

Если туннель запущен, он будет остановлен перед заменой и перезапущен.

Управление туннелями (Start/Stop)

МетодПутьОписаниеАутентификация
POST/control/start?id=Запустить туннельда
POST/control/stop?id=Остановить туннельда
POST/control/restart?id=Перезапустить туннельда
POST/control/restart-allПерезапустить все включённые туннелида
POST/control/toggle-enabled?id=Переключить флаг enabled (автозапуск)да
POST/control/toggle-default-route?id=Переключить маршрут по умолчаниюда

Все эндпоинты возвращают обновлённый туннель (как в GET /tunnels/get?id=).

Статус туннелей

МетодПутьОписаниеАутентификация
GET/status/get?tunnel=Получить состояние одного туннеля (runtime)да
GET/status/allСостояние всех туннелейда

Отличаются облегчённой структурой (только статус, счётчики). Используются внутри orchestrator.

Ping‑check мониторинг

МетодПутьОписаниеАутентификация
GET/pingcheck/statusСтатус мониторинга всех туннелей (вкл/выкл, результаты)да
GET/pingcheck/logsЛоги проверок (с фильтром ?tunnelId=)да
POST/pingcheck/logs/clearОчистить все логида
POST/pingcheck/check-nowЗапустить немедленную проверку всех туннелейда
GET/tunnels/pingcheck?id=Получить конфигурацию ping‑check для туннеляда
POST/tunnels/pingcheck?id=Создать/обновить ping‑check для туннеляда
POST/tunnels/pingcheck/remove?id=Удалить ping‑check для туннеляда

Конфигурация ping‑check (тело POST):

{
  "host": "8.8.8.8",
  "mode": "icmp",          // icmp, connect, tls
  "updateInterval": 45,
  "maxFails": 3,
  "minSuccess": 1,
  "timeout": 5,
  "restart": true,
  "port": 0
}

GET /pingcheck/status ответ:

{
  "enabled": true,
  "tunnels": [
    {
      "tunnelId": "my-tunnel",
      "tunnelName": "My Tunnel",
      "enabled": true,
      "status": "alive",
      "method": "icmp",
      "lastCheck": "2025-01-01T12:00:00Z",
      "failCount": 0
    }
  ]
}

Внешние туннели (неуправляемые)

МетодПутьОписаниеАутентификация
GET/external-tunnelsСписок WireGuard‑туннелей, не созданных менеджеромда
POST/external-tunnels/adopt?interface=Принять внешний туннель под управлениеда

GET /external-tunnels ответ:

[
  {
    "interfaceName": "opkgtun5",
    "tunnelNumber": 5,
    "isAWG": true,
    "publicKey": "...",
    "endpoint": "1.2.3.4:51820",
    "lastHandshake": "2025-01-01T12:00:00Z",
    "rxBytes": 123,
    "txBytes": 456
  }
]

POST /external-tunnels/adopt?interface=opkgtun5
Тело: { "content": "полный конфиг", "name": "желаемое имя" }
Ответ: созданный туннель (аналогично /tunnels/get?id=).

Системные туннели (нативные Keenetic)

МетодПутьОписаниеАутентификация
GET/system-tunnelsСписок видимых (не скрытых) системных туннелейда
GET/system-tunnels/get?name=Детали одного туннеляда
GET/system-tunnels/asc?name=Получить ASC‑параметрыда
POST/system-tunnels/asc?name=Установить ASC‑параметры (raw JSON)да
GET/system-tunnels/test-connectivity?name=Проверить связность через туннельда
GET/system-tunnels/test-ip?name=&service=Проверить внешний IP через туннельда
GET/system-tunnels/test-speed?name=&server=&port=&direction=Тест скорости (SSE)да
POST/system-tunnels/hide?name=Скрыть туннель из спискада
DELETE/system-tunnels/hide?name=Показать туннель (убрать из скрытых)да
GET/system-tunnels/hiddenСписок ID скрытых туннелейда

Примечание: Имя должно быть WireguardN.

Политики доступа (Access Policies) – только OS5

МетодПутьОписаниеАутентификация
GET/access-policiesСписок политик (плюс количество устройств)да
POST/access-policies/createСоздать новую политикуда
DELETE/access-policies/delete?name=Удалить политикуда
POST/access-policies/descriptionОбновить описание политикида
POST/access-policies/standaloneВключить/выключить standalone режимда
POST/access-policies/permitРазрешить интерфейс на политике (с порядком)да
DELETE/access-policies/permit?name=&interface=Запретить интерфейсда
POST/access-policies/assignНазначить устройство политикеда
DELETE/access-policies/assign?mac=Отвязать устройствода
GET/access-policies/devicesСписок LAN‑устройств с назначенными политикамида
GET/access-policies/interfacesСписок интерфейсов, доступных для policy routingда
POST/access-policies/interface-upПоднять/опустить интерфейсда

Параметр ?refresh=true для GET /access-policies и GET /access-policies/devices – принудительно сбрасывает кэш NDMS.

Пример создания политики:

{ "description": "My Policy" }

Ответ: { "name": "Policy0" }.

Пример назначения устройства:

{ "mac": "AA:BB:CC:DD:EE:FF", "policy": "Policy0" }

Пример разрешения интерфейса:

{ "name": "Policy0", "interface": "Wireguard0", "order": 0 }

Поднять/опустить интерфейс:

{ "name": "Wireguard0", "up": true }

DNS‑маршруты

МетодПутьОписаниеАутентификация
GET/dns-routes/listСписок всех DNS‑маршрутов (доменных списков)да
GET/dns-routes/get?id=Получить один списокда
POST/dns-routes/createСоздать списокда
POST/dns-routes/update?id=Обновить списокда
POST/dns-routes/delete?id=Удалить списокда
POST/dns-routes/delete-batchУдалить несколько списков по IDда
POST/dns-routes/create-batchСоздать несколько списковда
POST/dns-routes/set-enabled?id=Включить/отключить списокда
POST/dns-routes/bulk-backendСменить бэкенд для нескольких списковда
POST/dns-routes/refreshОбновить подписки (все или по ID)да

Структура DNS‑маршрута:

{
  "id": "dns-1",
  "name": "My Domains",
  "domains": ["example.com", "domain.org"],
  "enabled": true,
  "backend": "ndms",       // ndms, hydraroute или static
  "subscriptionURL": "",
  "lastUpdate": ""
}

Пример создания:

{
  "name": "My Domains",
  "domains": ["example.com"],
  "backend": "ndms"
}

Bulk backend:

{ "listIDs": ["id1","id2"], "backend": "hydraroute" }

Статические маршруты

МетодПутьОписаниеАутентификация
GET/static-routes/listСписок списков статических маршрутовда
POST/static-routes/createСоздать новый списокда
POST/static-routes/updateОбновить существующий списокда
POST/static-routes/delete?id=Удалить списокда
POST/static-routes/set-enabled?id=Включить/отключить списокда
POST/static-routes/importИмпортировать подсети из .bat файлада

Структура:

{
  "id": "static-1",
  "name": "Route List",
  "subnets": ["192.168.2.0/24", "10.0.0.0/16"],
  "enabled": true,
  "tunnelID": "my-tunnel"
}

Импорт:

{
  "tunnelID": "my-tunnel",
  "name": "Imported Routes",
  "content": "route add ...\nroute add ..."
}

Клиентские маршруты

МетодПутьОписаниеАутентификация
GET/client-routesСписок клиентских маршрутов (device → tunnel)да
POST/client-routes/createСоздать маршрутда
POST/client-routes/update?id=Обновитьда
POST/client-routes/delete?id=Удалитьда
POST/client-routes/toggle?id=Включить/отключитьда

Структура:

{
  "id": "cr-1",
  "clientIP": "192.168.1.100",
  "tunnelID": "my-tunnel",
  "enabled": true
}

WAN статус

МетодПутьОписаниеАутентификация
GET/wan/statusТекущий статус WAN‑интерфейсовда

Ответ:

{
  "interfaces": {
    "ppp0": { "up": true, "label": "PPPoE" },
    "eth3": { "up": false, "label": "WAN" }
  },
  "anyWANUp": true
}

Соединения (conntrack)

МетодПутьОписаниеАутентификация
GET/connectionsСписок активных соединений (фильтрация, пагинация)да

Параметры:

  • tunnel – имя туннеля (интерфейс)
  • protocol – tcp/udp/icmp
  • search – поиск по IP или порту
  • sortBy – поле сортировки (например, rxBytes)
  • sortDirasc или desc
  • offset – сдвиг (постранично)
  • limit – количество записей на страницу (максимум 1000, иначе обрезается)

Ответ:

{
  "total": 42,
  "connections": [
    {
      "srcIP": "192.168.1.100",
      "srcPort": 12345,
      "dstIP": "8.8.8.8",
      "dstPort": 443,
      "protocol": "tcp",
      "state": "ESTABLISHED",
      "tunnel": "awg0",
      "rxBytes": 1024,
      "txBytes": 2048
    }
  ]
}

Диагностика

МетодПутьОписаниеАутентификация
POST/diagnostics/runЗапустить фоновую диагностику (сбор отчёта)да
GET/diagnostics/statusТекущий статус выполненияда
GET/diagnostics/resultСкачать последний отчёт (JSON, attachment)да
GET/diagnostics/streamSSE‑поток прогресса диагностикида

Параметры /diagnostics/stream:

  • mode=quick|full (по умолчанию quick)
  • restart=true – перезапускать ли sing‑box при измерении
  • route=direct|tunnel – режим маршрутизации для тестов
  • tunnelId=xxx – ID туннеля при route=tunnel

Логи приложения

МетодПутьОписаниеАутентификация
GET/logsПолучить записи логов (с фильтрацией)да
POST/logs/clearОчистить все логида

Параметры GET:

  • group – группа (tunnel, system, routing)
  • subgroup – подгруппа (lifecycle, settings, dnsroute …)
  • level – info, warn, error, debug
  • limit – количество (default 200)
  • offset – сдвиг

Ответ:

{
  "enabled": true,
  "logs": [
    { "timestamp": "2025-01-01T12:00:00Z", "level": "info", "group": "tunnel", "subgroup": "lifecycle", "message": "Tunnel started" }
  ],
  "total": 1500
}

Тестирование туннелей

МетодПутьОписаниеАутентификация
GET/test/ip?id=&service=Проверить внешний IP через туннельда
GET/test/ip/servicesСписок доступных сервисов проверки IPда
GET/test/connectivity?id=Проверить связность (ping/http) через туннельда
GET/test/speed/serversСписок предустановленных iperf3‑серверовда
GET/test/speed?id=&server=&port=&direction=Тест скорости (одно направление, блокирующий)да
GET/test/speed/stream?id=&server=&port=&direction=SSE‑поток теста скорости (с интервалами)да

Пример ответа /test/ip:

{ "ip": "1.2.3.4", "service": "ipv4.icanhazip.com" }

Пример ответа /test/connectivity:

{ "connected": true, "latency": 42, "reason": "" }

HydraRoute Neo

МетодПутьОписаниеАутентификация
GET/hydraroute/configПолучить текущую конфигурацию (JSON)да
PUT/hydraroute/config/updateЗаписать конфигурацию (полный объект)да
GET/hydraroute/geo-filesСписок загруженных geo‑файловда
POST/hydraroute/geo-files/addСкачать и зарегистрировать geo‑файл (body: {url, path})да
DELETE/hydraroute/geo-files?path=Удалить geo‑файлда
POST/hydraroute/geo-files/updateПринудительно обновить geo‑файл(ы)да
GET/hydraroute/geo-tagsПолучить полный список тегов всех geo‑файловда
GET/hydraroute/ipset-usageСтатистика использования ipsetда
POST/hydraroute/policy-orderУстановить порядок политикда
GET/hydraroute/oversized-tagsТеги, превышающие лимит ipsetда

Sing‑box

МетодПутьОписаниеАутентификация
GET/singbox/statusСтатус установки и процессада
POST/singbox/installУстановить sing‑box (opkg)да
GET/singbox/tunnelsСписок туннелей (outbounds) с историей задержекда
POST/singbox/tunnelsДобавить туннели из списка ссылокда
GET/singbox/tunnels?tag=Получить один outbound (raw JSON)да
PUT/singbox/tunnels?tag=Обновить outbound (raw JSON)да
DELETE/singbox/tunnels?tag=Удалить туннельда
POST/singbox/tunnels/delay-check?tag=Разовая проверка задержкида
GET/singbox/tunnels/test/speed/stream?tag=&server=&port=Тест скорости через туннель (SSE)да
*/singbox/clash/, /singbox/clash/*Прокси Clash API (HTTP + WebSocket)да

Добавление туннелей:

{ "links": "vless://...\nhy2://...\ntrojan://..." }

Ответ: { "imported": [...], "errors": [...], "tunnels": [...] }

GET /singbox/tunnels ответ (enriched):

[
  {
    "tag": "my-tunnel",
    "type": "vless",
    "server": "example.com",
    "port": 443,
    "connectivity": { "connected": true, "latency": 120 }
  }
]

Clash API проксирует все эндпоинты (например, /proxies, /connections, /traffic, /logs, /configs).

Device Proxy (SOCKS5/HTTP)

МетодПутьОписаниеАутентификация
GET/proxy/configПолучить конфигурацию проксида
PUT/proxy/configСохранить конфигурацию и применитьда
POST/proxy/applyПолная перезагрузка sing‑box с текущим конфигомда
GET/proxy/runtimeТекущий выбранный outbound (активный)да
POST/proxy/runtime/selectПереключить outbound на летуда
GET/proxy/outboundsСписок доступных outbound‑тэговда
GET/proxy/listen-choicesСписок интерфейсов и LAN IP для прослушиванияда

PUT /proxy/config тело:

{
  "enabled": true,
  "port": 1080,
  "listenAll": true,
  "selectedOutbound": "direct",
  "auth": { "enabled": false, "username": "", "password": "" }
}

POST /proxy/runtime/select:

{ "tag": "my-tunnel" }

Захват сигнатуры

МетодПутьОписаниеАутентификация
GET/signature/capture?domain=Получить сигнатуру Keenetic для доменада

Используется для обхода прозрачного прокси (AmneziaWG).
Ответ: { "signature": "..." }

Терминал (ttyd)

МетодПутьОписаниеАутентификация
GET/terminal/statusСтатус установки и запуска ttydда
POST/terminal/installУстановить ttyd через opkgда
POST/terminal/startЗапустить ttyd (выбрать порт)да
POST/terminal/stopОстановить ttydда
GET/terminal/wsWebSocket‑соединение (прокси на ttyd)да

Статус:

{ "installed": true, "running": true, "sessionActive": false }

Пример ответа:

{ "success": false, "error": "Terminal already open in another tab", "code": "SESSION_ACTIVE" }

WebSocket требует подпротокола tty. При активной сессии другие подключения отклоняются (409 Confict).

Server‑Sent Events (SSE)

Endpoint: GET /events (требует аутентификации)
Content-Type: text/event-stream

События публикуются в реальном времени. Клиент должен перезапрашивать холодные данные по resource:invalidated.

Типы событий и данные:

Тип событияПоля dataОписание
connected{"ok":true}Начало потока
resource:invalidated{"resource":"tunnels","reason":"create"}Клиент должен перезапросить указанный ресурс
tunnel:state{"id":"...","name":"...","state":"running","backend":"kernel"}Изменение состояния туннеля
tunnel:deleted{"id":"..."}Туннель удалён
connectivityРезультат проверки связности(структура не фиксирована)
pingcheck:logЗапись лога ping‑check{...}
logsЗапись системного лога{...}
singbox:trafficМассив {tag, upload, download}Трафик sing‑box туннелей
singbox:delay{tag, delay, timestamp}Результат проверки задержки
deviceproxy:missing-target{tag}Выбранный outbound больше не существует
tunnel:traffic{id, rxBytes, txBytes}Обновление трафика конкретного туннеля

Пример потока:

event: connected
data: {"ok":true}

event: resource:invalidated
data: {"resource":"tunnels","reason":"list-changed"}

event: tunnel:state
data: {"id":"my-tunnel","state":"running","backend":"kernel"}

Унифицированные маршрутизационные ресурсы (polling aliases)

Эти эндпоинты используются фронтендом для опроса (polling) и повторяют данные из соответствующих разделов.

МетодПутьОписаниеАутентификация
GET/routing/tunnelsСписок туннелей для маршрутизации (catalog)да
POST/routing/refreshПринудительно сбросить кэши NDMS и опубликовать invalidatedда
GET/routing/resolve?address=Разрешить IP/домен через NDMSда
GET/routing/dns-routesАлиас на /dns-routes/listда
GET/routing/static-routesАлиас на /static-routes/listда
GET/routing/client-routesАлиас на /client-routesда
GET/routing/policy-devicesАлиас на /access-policies/devices (hotspot)да
GET/routing/access-policiesСписок политик (OS5) или [] (OS4)да
GET/routing/policy-interfacesСписок интерфейсов для политик (OS5) или [] (OS4)да

POST /routing/refresh возвращает { "missing": [...] } (список отсутствующих целей).

Прочие эндпоинты

МетодПутьОписаниеАутентификация
GET/dns-check/startЗапустить кастомный DNS‑зонд (в фоне)да
GET/dns-check/probeEndpoint для приёма DNS‑запросов от клиента (CORS, public)public
POST/hook/ndmsWebhook для уведомлений NDMS (ifcreated, ifdestroyed, iflayerchanged)public

POST /hook/ndms принимает form-urlencoded с полями: type, id, system_name, layer, level, address, up, connected. Используется скриптами NDMS.

Основные коды ошибок

METHOD_NOT_ALLOWED, UNAUTHORIZED, BAD_REQUEST, NOT_FOUND, INVALID_JSON, MISSING_NAME, MISSING_ID, MISSING_MAC, INVALID_NAME, INVALID_ID, INVALID_ENDPOINT, CREATE_FAILED, UPDATE_FAILED, DELETE_FAILED, LIST_FAILED, AUTH_FAILED, ROUTER_UNAVAILABLE, INTERNAL_ERROR, CONFLICT, SERVICE_UNAVAILABLE, NO_STREAMING, PINGCHECK_CONFIGURE_ERROR, PINGCHECK_REMOVE_ERROR, HYDRAROUTE_CONTROL_ERROR, GET_ASC_FAILED, SET_ASC_FAILED, STATIC_ROUTE_IMPORT_ERROR, NOT_RUNNING, SESSION_ACTIVE


Документация составлена по исходному коду awg‑manager (файлы server.go, api/.go, internal/…). Актуальна для версии ≥2.8.0.*

Что дальше?