DadwaySubs 1.8

Инструкция по API

Управление итоговыми подписками из внешних систем

Начало работы

API позволяет получать источники 3x-ui, создавать итоговые подписки, назначать им источники, изменять срок действия и активность, а также удалять подписки.

Базовый адрес
https://subs.dadway.ru
Интерактивная схема

Получение ключа

  1. Вернитесь в административную панель.
  2. Откройте раздел Настройки → API-ключи.
  3. Заполните отдельное поле Комментарий — назначение ключа.
  4. Нажмите Создать API-ключ, скопируйте и сохраните значение: оно показывается только один раз.

Можно создавать несколько независимых ключей. У каждого — комментарий, статус, даты создания, обновления и последнего использования. Комментарий можно редактировать. Отозвать закрывает доступ только по выбранному ключу. Перевыпустить заменяет выбранный ключ (в том числе отозванный); остальные остаются действующими. Старый ключ системы сохраняется.

Управление администратором с JWT: GET /api/settings/api-keys; POST туда же с JSON {"comment":"CRM"}; PATCH /api/settings/api-keys/{id} для комментария; POST /api/settings/api-keys/{id}/rotate для перевыпуска; DELETE /api/settings/api-keys/{id} для отзыва.

Авторизация

Каждый запрос к /api/v1/* должен содержать заголовок Bearer. Для запросов с телом добавьте Content-Type: application/json.

Authorization: Bearer dws_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
Не передавайте API-ключ в URL и не сохраняйте его в Git. Перевыпуск немедленно отключает прежнее значение только выбранного ключа.

Получение ID источников

Перед созданием подписки запросите числовые ID доступных источников.

GET/api/v1/sources
curl -sS https://subs.dadway.ru/api/v1/sources \
  -H "Authorization: Bearer $API_TOKEN"

Ответ содержит id, unique_id, название, площадку region (msk или spb), URL, порядок сортировки, статус и срок каждого источника.

Создание итоговой подписки

POST/api/v1/subscriptions
curl -sS -X POST https://subs.dadway.ru/api/v1/subscriptions \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Клиент №1",
    "environment": "test",
    "region": "msk",
    "public_id": "client-001",
    "remark": "dadway.ru",
    "cost": 1490.00,
    "active": true,
    "expires_at": "2026-12-31T23:59:59Z",
    "update_interval_hours": 1,
    "hwid_mode": "audit",
    "hwid_limit": 0
  }'
ПолеОбязательноОписание
nameДаНазвание, до 120 символов
environmentНетprod или test; по умолчанию test
regionНетmsk, spb или all; по умолчанию all
public_idНетУникальный ID; если не указан, генерируется автоматически
remarkНетПримечание при импорте, по умолчанию dadway.ru
costНетСправочная стоимость для отчётов, неотрицательное число с двумя знаками после запятой
activeНетПо умолчанию true
expires_atНетДата окончания в ISO 8601 или null
created_atНетДата и время создания в ISO 8601; по умолчанию устанавливается текущее время, позднее может быть изменена в панели
source_idsНетЕсли отсутствует — автовыбор по region; явные ID должны соответствовать площадке
update_interval_hoursНетОт 1 до 24, по умолчанию 1 час
hwid_modeНетdisabled, audit или enforce; по умолчанию disabled
hwid_limitНетОт 1 до 100 только для контроля; аудит без лимита использует 0
msk автоматически назначает все источники msk, spb — все источники spb, all — все источники. Явный source_ids может ограничить выбор совместимым подмножеством.

Минимальное тело запроса: {"name":"Новая подписка"}. Будет выбрана площадка all, назначены все источники и возвращён готовый public_url.

Получение и изменение подписки

МетодМаршрутНазначение
GET/api/v1/subscriptionsВсе подписки
GET/api/v1/subscriptions/{public_id}Одна подписка
PATCH/api/v1/subscriptions/{public_id}/expirationИзменить срок
PATCH/api/v1/subscriptions/{public_id}/statusБлокировать или активировать
PUT/api/v1/subscriptions/{public_id}/sourcesПолностью заменить список источников

Продлить срок

curl -sS -X PATCH \
  https://subs.dadway.ru/api/v1/subscriptions/client-001/expiration \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"expires_at":"2027-01-31T23:59:59Z"}'

Заблокировать

curl -sS -X PATCH \
  https://subs.dadway.ru/api/v1/subscriptions/client-001/status \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"active":false}'

Заменить источники

curl -sS -X PUT \
  https://subs.dadway.ru/api/v1/subscriptions/client-001/sources \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"source_ids":[2,3,7]}'

Все указанные источники должны соответствовать region итоговой подписки; для all разрешены обе площадки.

Окончившаяся подписка возвращает пустой ответ 410 Gone. Отключённая подписка возвращает пустой 404 Not Found; источники при этом не запрашиваются.

Контроль устройств по HWID

disabled не требует HWID; audit считает устройства без блокировки; enforce закрывает выдачу без X-HWID, при превышении лимита или ручной блокировке.

Включить аудит или контроль

curl -sS -X PATCH \
  https://subs.dadway.ru/api/v1/subscriptions/client-001/hwid-limit \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"audit","limit":0}'
МетодМаршрутНазначение
GET/api/v1/subscriptions/{public_id}/devicesСписок устройств
PATCH/api/v1/subscriptions/{public_id}/devices/{device_id}Тело {"blocked":true} блокирует устройство
DELETE/api/v1/subscriptions/{public_id}/devices/{device_id}Удалить и освободить слот
DELETE/api/v1/subscriptions/{public_id}/devicesОчистить весь список

Публичный запрос клиента

curl -sS https://subs.dadway.ru/sub/client-001 \
  -H "X-HWID: stable-device-identifier"
В базе хранятся точный X-HWID и его HMAC-отпечаток. Аудит накапливает HWID без лимита и не блокирует выдачу. Режим контроля не отзывает уже импортированные VPN-ключи.

Удаление подписки

Удаление через внешний API разрешено только для prod. Подписки среды test защищены: ответ 403 Forbidden, карточка сохраняется. Правило действует для всех API-ключей. Администратор панели может удалить карточку вручную. Другие API-операции не блокируются.
DELETE/api/v1/subscriptions/{public_id}
curl -sS -X DELETE \
  https://subs.dadway.ru/api/v1/subscriptions/client-001 \
  -H "Authorization: Bearer $API_TOKEN"

Успешный ответ: 204 No Content. Публичная ссылка перестаёт существовать.

Коды ответов

200 OKЗапрос выполнен
201 CreatedПодписка создана
204 No ContentПодписка или устройство удалено, либо токен отозван
401 UnauthorizedТокен отсутствует или недействителен
403 ForbiddenHWID заблокирован, неверен или лимит исчерпан
404 Not FoundПодписка не найдена или отключена
409 Conflictpublic_id уже существует
410 GoneСрок публичной подписки истёк
422 Unprocessable EntityНекорректные поля или ID источников
428 Precondition RequiredНе передан X-HWID в режиме контроля

Важные ограничения

  • Используйте API только через HTTPS.
  • Храните токен в переменной окружения или менеджере секретов.
  • При подозрении на утечку перевыпустите токен в «Настройках».
  • Блокировка в DadwaySubs закрывает получение и обновление подписки. Уже импортированные VLESS/VMess-ключи необходимо дополнительно отключать на серверах 3x-ui.