StealthSurf VPNStealthSurf VPN
Доступные методыПрофиль

Конструктор подписок

Методы для управления пользовательскими подписками: создание, изменение, удаление.

Обзор

Модуль для работы с пользовательскими подписками. Базовый путь: /profile/custom-subscriptions. Доступны методы GET/POST/PATCH/PUT/DELETE. Позволяет собирать собственные подписки из конфигов/платных опций, управлять устройствами, настройками отображения, маршрутизацией и Xray JSON-режимом.

Общие схемы раздела

  • CustomSubscriptionData: { id, title, subscription_key (расшифрован), items_count }.
  • CustomSubscriptionDetailData: CustomSubscriptionData + items: CustomSubscriptionItemData[].
  • CustomSubscriptionItemData: { id, item_type, item_reference_id, item_index?, position, resolved_title, is_valid, server_config? }.
  • CustomSubscriptionItemBody (используется при создании/замене items): item_type (@IsIn(['user_config','cloud_server_config','paid_option','paid_option_index','paid_option_config'])), item_reference_id (@IsInt @Min(1)), item_index? (@IsInt @Min(0) @Max(20)).

GET /profile/custom-subscriptions

Получить список пользовательских подписок (сортировка по created_at DESC).

Rate Limit: глобальный (60 req/min)

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: Array<{
    id: number
    title: string
    subscription_key: string
    items_count: number
  }>
}

GET /profile/custom-subscriptions/available-items

Получить доступные элементы для создания подписки.

Rate Limit: глобальный (60 req/min)

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/available-items" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    configs: Array<{
      id: number
      title: string
      location_emoji?: string
      expires_at: number
      is_online: boolean
      source: "user_config" | "cloud_server_config"
      cloud_server_id?: number   // только для source: "cloud_server_config"
    }>
    paid_options: Array<{
      id: number
      title: string
      expires_at: number
      configs: Array<{
        type: "index"
        users_paid_option_id: number
        expires_at: number
        index: number
        original_title: string
        custom_title: string | null
      } | {
        type: "server"
        id: number
        server_id: number
        title: string
        is_online: boolean
      }>
    }>
  }
}

Конфиги с протоколом amnezia-wg/outline исключены из выдачи.


GET /profile/custom-subscriptions/:id

Получить детали пользовательской подписки (items по position ASC).

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    id: number
    title: string
    subscription_key: string
    items_count: number
    items: Array<{
      id: number
      item_type: string
      item_reference_id: number
      item_index: number | null
      position: number
      resolved_title: string | null
      is_valid: boolean
      server_config: {
        id: number
        server_id: number
        location_id: number
        title: string
        protocol: string
      } | null
    }>
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

POST /profile/custom-subscriptions

Создать пользовательскую подписку.

Rate Limit: 3 req / 5 sec

Request Body

FieldTypeRequiredDescription
titlestringДаНазвание (1-64 символа)
itemsArrayДаЭлементы подписки (1-50)
items[].item_typestringДаuser_config | cloud_server_config | paid_option | paid_option_index | paid_option_config
items[].item_reference_idnumberДаID элемента
items[].item_indexnumberНетИндекс для paid_option_index (0-20)

Пример запроса

curl -X POST "https://api.stealthsurf.net/profile/custom-subscriptions" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Моя подписка",
    "items": [
      { "item_type": "user_config", "item_reference_id": 123 },
      { "item_type": "paid_option_index", "item_reference_id": 456, "item_index": 0 }
    ]
  }'

Ответ

{
  status: true,
  statusCode: 201,
  data: {
    id: number
    title: string
    subscription_key: string
    items_count: number
    items: Array<{
      id: number
      item_type: string
      item_reference_id: number
      item_index: number | null
      position: number
      resolved_title: string | null
      is_valid: boolean
      server_config: {
        id: number
        server_id: number
        location_id: number
        title: string
        protocol: string
      } | null
    }>
  }
}

Ошибки

errorCodemessageКогда
28custom subscription limit reachedДостигнут лимит кастомных подписок
3bad requestНевалидные данные запроса
30custom subscription invalid itemНеверный элемент подписки

PATCH /profile/custom-subscriptions/:id/title

Обновить название подписки.

Rate Limit: 5 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Request Body

FieldTypeRequiredDescription
titlestringДаНовое название (1-64 символа)

Пример запроса

curl -X PATCH "https://api.stealthsurf.net/profile/custom-subscriptions/123/title" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Новое название"
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    id: number
    title: string
    subscription_key: string
    items_count: number
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

PUT /profile/custom-subscriptions/:id/items

Заменить элементы подписки.

Rate Limit: 3 req / 2 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Request Body

FieldTypeRequiredDescription
itemsArrayДаНовые элементы (заменяют существующие, 1-50)
items[].item_typestringДаuser_config | cloud_server_config | paid_option | paid_option_index | paid_option_config
items[].item_reference_idnumberДаID элемента
items[].item_indexnumberНетИндекс для paid_option_index (0-20)

Пример запроса

curl -X PUT "https://api.stealthsurf.net/profile/custom-subscriptions/123/items" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "item_type": "user_config", "item_reference_id": 789 }
    ]
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    id: number
    title: string
    subscription_key: string
    items_count: number
    items: Array<{
      id: number
      item_type: string
      item_reference_id: number
      item_index: number | null
      position: number
      resolved_title: string | null
      is_valid: boolean
      server_config: {
        id: number
        server_id: number
        location_id: number
        title: string
        protocol: string
      } | null
    }>
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
3bad requestНевалидные данные запроса
30custom subscription invalid itemНеверный элемент подписки

PATCH /profile/custom-subscriptions/:id/items/order

Изменить порядок элементов подписки.

Rate Limit: 5 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Request Body

FieldTypeRequiredDescription
item_idsnumber[]ДаID элементов в нужном порядке (1-50, ровно существующие ID, без дубликатов)

Пример запроса

curl -X PATCH "https://api.stealthsurf.net/profile/custom-subscriptions/123/items/order" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "item_ids": [3, 1, 2]
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    id: number
    title: string
    subscription_key: string
    items_count: number
    items: Array<{
      id: number
      item_type: string
      item_reference_id: number
      item_index: number | null
      position: number
      resolved_title: string | null
      is_valid: boolean
      server_config: {
        id: number
        server_id: number
        location_id: number
        title: string
        protocol: string
      } | null
    }>
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
3bad requestНевалидные данные запроса

POST /profile/custom-subscriptions/:id/reset-key

Переиздать ключ подписки.

Rate Limit: 2 req / 10 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X POST "https://api.stealthsurf.net/profile/custom-subscriptions/123/reset-key" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 201,
  data: {
    id: number
    title: string
    subscription_key: string    // Новый ключ
    items_count: number
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

После переиздания ключа старый ключ перестанет работать. Убедитесь, что обновили ключ во всех приложениях.


DELETE /profile/custom-subscriptions/:id

Удалить подписку.

Rate Limit: 3 req / 2 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X DELETE "https://api.stealthsurf.net/profile/custom-subscriptions/123" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: true
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

Получить зашифрованную ссылку подписки (Happ).

Rate Limit: 3 req / 60 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/encrypted-subscription-link" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: string  // Зашифрованная ссылка
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
3bad requestНевалидные данные запроса

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

Методы для управления настройками отображения кастомной подписки в приложениях (заголовок профиля, объявление, ссылки, кастомные заголовки ответа).


GET /profile/custom-subscriptions/:id/display/settings

Получить настройки отображения подписки.

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/display/settings" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    profile_title: string | null
    announce: string | null
    announce_url: string | null
    support_url: string | null
    profile_web_page_url: string | null
    custom_headers: Array<{
      name: string
      value: string
    }> | null
    profile_update_interval: number   // по умолчанию 12 (часы)
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

PATCH /profile/custom-subscriptions/:id/display/settings

Обновить настройки отображения подписки.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Request Body

FieldTypeRequiredDescription
profile_titlestringНетЗаголовок профиля (MaxLength 25)
announcestringНетТекст объявления с разметкой цвета {#HEX}текст{/} (MaxLength 200)
announce_urlstringНетСсылка объявления (валидный URL)
support_urlstringНетСсылка поддержки (валидный URL)
profile_web_page_urlstringНетСсылка на веб-страницу профиля (валидный URL)
custom_headersobject[] | nullНетКастомные заголовки ответа (макс. 20). Каждый: name (string, 1-64), value (string, MaxLength 1024). Нормализуются на сервере (имена в нижнем регистре, проверка blacklist, без дубликатов, лимит общего размера)
profile_update_intervalnumberНетИнтервал автообновления, ч (@IsInt, @Min(1), @Max(12))

Пример запроса

curl -X PATCH "https://api.stealthsurf.net/profile/custom-subscriptions/123/display/settings" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "profile_title": "My VPN",
    "announce": "ℹ️ {#2181CD}Update{/} subscription",
    "support_url": "https://t.me/my_support",
    "custom_headers": [
      { "name": "x-subscription-owner", "value": "family" }
    ]
  }'

Ответ

Такой же как GET /profile/custom-subscriptions/:id/display/settings.

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
3bad requestОшибка валидации заголовков: дубли, запрещённые имена, CR/LF/NUL, превышение размера и т.д.

XRay шаблон подписки

Методы для управления XRay шаблоном (JSON mode) кастомной подписки.


GET /profile/custom-subscriptions/:id/xray-template/settings

Получить настройки XRay JSON mode для подписки.

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/xray-template/settings" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    json_mode: boolean
    json_default_config_tag: string | null    // устарело
    fragment: boolean
    auto_select_enabled: boolean
    auto_select_name: string | null
    global_quick_toggles: {
      ruDirect: boolean
      ruWhitelistDirect: boolean
      lanDirect: boolean
      bittorrentDirect: boolean
      blockQuic: boolean
      blockAds: boolean
      gameDownloadsDirect: boolean
      blockPorn: boolean
    }
    custom_auto_selects: Array<{
      id: number
      name: string
      strategy: "leastPing" | "leastLoad" | "random" | "roundRobin"
      config_tags: string[]
    }>
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

PATCH /profile/custom-subscriptions/:id/xray-template/settings

Обновить настройки XRay JSON mode для подписки.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Request Body

FieldTypeRequiredDescription
json_modebooleanНетВключить JSON mode для подписки
json_default_config_tagstringНет(Устарело) Тег исходящего по умолчанию. Формат ^(config|cloud|option|ext)-\d+$
fragmentbooleanНетВключить TLS-фрагмент (обход DPI)
auto_select_enabledbooleanНетВключить виртуальный конфиг авто-выбора с балансировщиком leastPing
auto_select_namestringНетОтображаемое имя конфига авто-выбора (MaxLength 128)
global_quick_togglesobjectНетЧастичное слияние. Допустимые ключи: ruDirect, ruWhitelistDirect, lanDirect, bittorrentDirect, blockQuic, blockAds, gameDownloadsDirect, blockPorn. Каждое значение — boolean
custom_auto_selectsobject[]НетНабор авто-выборов (заменяет существующие). @ArrayMaxSize(10), @ValidateNested({each})

CustomAutoSelectBody: id?, name (@Length(1,64)), strategy? (@IsIn(['leastPing','leastLoad','random','roundRobin'])), config_tags (@ArrayMinSize(2) @ArrayMaxSize(50), формат config-N/option-N/cloud-N/ext:N:M). Все поля тела необязательны.

Пример запроса

curl -X PATCH "https://api.stealthsurf.net/profile/custom-subscriptions/123/xray-template/settings" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "json_mode": true,
    "fragment": false,
    "global_quick_toggles": {
      "ruDirect": true
    }
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    json_mode: boolean
    json_default_config_tag: string | null    // устарело
    fragment: boolean
    auto_select_enabled: boolean
    auto_select_name: string | null
    global_quick_toggles: {
      ruDirect: boolean
      ruWhitelistDirect: boolean
      lanDirect: boolean
      bittorrentDirect: boolean
      blockQuic: boolean
      blockAds: boolean
      gameDownloadsDirect: boolean
      blockPorn: boolean
    }
    custom_auto_selects: Array<{
      id: number
      name: string
      strategy: "leastPing" | "leastLoad" | "random" | "roundRobin"
      config_tags: string[]
    }>
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
75no xray-compatible configs available for json modeНет Xray-совместимых конфигов для JSON-режима
3bad requestНевалидные данные запроса

GET /profile/custom-subscriptions/:id/xray-template (устарело)

Получить XRay шаблон подписки.

Эндпоинт устарел, используйте xray-template/settings.

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/xray-template" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    template: string          // XRay шаблон (JSON)
    is_custom: boolean
    created_at: number        // Unix timestamp
    updated_at: number        // Unix timestamp
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

PUT /profile/custom-subscriptions/:id/xray-template (устарело)

Сохранить XRay шаблон подписки.

Эндпоинт устарел, используйте xray-template/settings.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Request Body

FieldTypeRequiredDescription
templatestringДаXRay JSON-шаблон (без outbounds, MaxLength 32768)

Пример запроса

curl -X PUT "https://api.stealthsurf.net/profile/custom-subscriptions/123/xray-template" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "template": "{...}"
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    template: string          // XRay шаблон (JSON)
    is_custom: boolean
    created_at: number        // Unix timestamp
    updated_at: number        // Unix timestamp
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
73xray template invalidНеверный Xray-шаблон

DELETE /profile/custom-subscriptions/:id/xray-template (устарело)

Сбросить XRay шаблон подписки к значениям по умолчанию.

Эндпоинт устарел, используйте xray-template/settings.

Rate Limit: 3 req / 2 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X DELETE "https://api.stealthsurf.net/profile/custom-subscriptions/123/xray-template" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: true
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

Устройства подписки

Методы для управления устройствами кастомной подписки.


GET /profile/custom-subscriptions/:id/devices

Получить список устройств подписки (по last_seen_at DESC).

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Query Parameters

ParameterTypeRequiredDescription
pagenumberНетНомер страницы (по умолчанию: 1)
limitnumberНетЗаписей на странице (1-100, по умолчанию: 20)

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/devices?page=1&limit=20" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    devices: Array<{
      id: number
      title: string | null
      device_name: string
      device_type: string           // ios, android, windows, macos, linux
      device_model: string
      os_version: string
      is_blocked: boolean
      country: string | null
      city: string | null
      isp: string | null
      last_seen_at: number          // Unix timestamp
      created_at: number            // Unix timestamp
    }>
    total: number
    page: number
    limit: number
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

GET /profile/custom-subscriptions/:id/devices/settings

Получить настройки устройств подписки.

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/devices/settings" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    block_unknown_devices: boolean
    device_limit: number            // 0 = безлимит
    force_ipv6: boolean
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

PATCH /profile/custom-subscriptions/:id/devices/settings

Обновить настройки устройств подписки.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Request Body

FieldTypeRequiredDescription
block_unknown_devicesbooleanНетБлокировать неизвестные устройства
device_limitnumberНетЛимит устройств (0-100, 0 = безлимит)
force_ipv6booleanНетПринудительно использовать IPv6 для доставки подписки

Пример запроса

curl -X PATCH "https://api.stealthsurf.net/profile/custom-subscriptions/123/devices/settings" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "block_unknown_devices": false,
    "device_limit": 5
  }'

Ответ

Такой же как GET /profile/custom-subscriptions/:id/devices/settings.

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

PATCH /profile/custom-subscriptions/:id/devices/:deviceId/title

Переименовать устройство.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки
deviceIdnumberДаID устройства

Request Body

FieldTypeRequiredDescription
titlestringДаНазвание устройства (1-64 символа)

Пример запроса

curl -X PATCH "https://api.stealthsurf.net/profile/custom-subscriptions/123/devices/456/title" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "mom"
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: true
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
40device not foundУстройство не найдено

PATCH /profile/custom-subscriptions/:id/devices/:deviceId/blocked

Заблокировать или разблокировать устройство.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки
deviceIdnumberДаID устройства

Request Body

FieldTypeRequiredDescription
is_blockedbooleanДаСтатус блокировки

Пример запроса

curl -X PATCH "https://api.stealthsurf.net/profile/custom-subscriptions/123/devices/456/blocked" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "is_blocked": true
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: true
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
40device not foundУстройство не найдено

DELETE /profile/custom-subscriptions/:id/devices/:deviceId

Удалить устройство из подписки.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки
deviceIdnumberДаID устройства

Пример запроса

curl -X DELETE "https://api.stealthsurf.net/profile/custom-subscriptions/123/devices/456" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: true
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена
40device not foundУстройство не найдено

DELETE /profile/custom-subscriptions/:id/devices

Удалить все устройства из подписки.

Rate Limit: 1 req / 2 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Пример запроса

curl -X DELETE "https://api.stealthsurf.net/profile/custom-subscriptions/123/devices" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    deleted_count: number  // Количество удалённых устройств
  }
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

Маршрутизация подписки

Методы для управления маршрутизацией (routing) и туннелями на уровне отдельных конфигов кастомной подписки.


GET /profile/custom-subscriptions/:id/routing/configs/:config_type/:config_reference_id

Получить настройки маршрутизации для конкретного конфига подписки.

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки
config_typestringДаОдин из: user_config, paid_option_config, paid_option_index, cloud_server_config, auto_select
config_reference_idnumberДаReference ID конфига

Query Parameters

ParameterTypeRequiredDescription
config_indexnumberНетИндекс конфига (по умолчанию: 0)

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/routing/configs/user_config/2?config_index=0" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    routing_rules: object[]
    tunnels: Array<{
      tag: string
      source_config_type: string
      source_config_id: number
      source_config_index: number
      source_config_label: string
    }>
    quick_toggle_overrides: object | null
    effective_quick_toggles: {
      ruDirect: boolean
      ruWhitelistDirect: boolean
      lanDirect: boolean
      bittorrentDirect: boolean
      blockQuic: boolean
      blockAds: boolean
      gameDownloadsDirect: boolean
      blockPorn: boolean
    }
  }
}

Ошибки

errorCodemessageКогда
3bad requestНевалидные данные запроса
27custom subscription not foundПодписка не найдена

PUT /profile/custom-subscriptions/:id/routing/configs/:config_type/:config_reference_id

Сохранить настройки маршрутизации для конкретного конфига подписки.

Rate Limit: 3 req / 1 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки
config_typestringДаОдин из: user_config, paid_option_config, paid_option_index, cloud_server_config, auto_select
config_reference_idnumberДаReference ID конфига

Query Parameters

ParameterTypeRequiredDescription
config_indexnumberНетИндекс конфига (по умолчанию: 0)

Request Body

FieldTypeRequiredDescription
routing_rulesunknown[]ДаМассив правил маршрутизации XRay (макс. 100). Каждое правило: type: "field", только разрешённые поля и outboundTag или balancerTag
tunnelsobject[]ДаМассив туннелей (макс. 50)
tunnels[].tagstringДаТег исходящего для этого туннеля
tunnels[].source_config_typestringДаТип конфига-источника
tunnels[].source_config_idnumberДаID конфига-источника
tunnels[].source_config_indexnumberНетИндекс конфига-источника (для paid_option_index)
quick_toggle_overridesobject | nullНетПереопределения быстрых переключателей (null = наследовать глобальные). Ключи — только 8 валидных quick-toggle ключей; значения — boolean

Пример запроса

curl -X PUT "https://api.stealthsurf.net/profile/custom-subscriptions/123/routing/configs/user_config/2?config_index=0" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY" \
  -H "Content-Type: application/json" \
  -d '{
    "routing_rules": [
      { "type": "field", "domain": ["geosite:google"], "outboundTag": "my-tunnel" }
    ],
    "tunnels": [
      { "tag": "my-tunnel", "source_config_type": "user_config", "source_config_id": 2 }
    ],
    "quick_toggle_overrides": null
  }'

Ответ

{
  status: true,
  statusCode: 200,
  data: {
    routing_rules: object[]       // Сохранённые правила
    tunnels: Array<{
      tag: string
      source_config_type: string
      source_config_id: number
      source_config_index: number
      source_config_label: string
    }>
    quick_toggle_overrides: object | null
    effective_quick_toggles: {
      ruDirect: boolean
      ruWhitelistDirect: boolean
      lanDirect: boolean
      bittorrentDirect: boolean
      blockQuic: boolean
      blockAds: boolean
      gameDownloadsDirect: boolean
      blockPorn: boolean
    }
  }
}

Ошибки

errorCodemessageКогда
3bad requestНевалидные данные запроса
27custom subscription not foundПодписка не найдена
1not foundКонфиг не найден
77INVALID_ROUTING_RULESНеверные правила маршрутизации
84AUTO_SELECT_NO_TUNNELSНет туннелей для авто-выбора
82RESERVED_TAG_NAMEЗарезервированное имя тега
81DUPLICATE_TUNNEL_TAGДублирующийся тег туннеля
80TUNNEL_SELF_REFERENCEТуннель ссылается сам на себя
78TUNNEL_CONFIG_NOT_FOUNDКонфиг туннеля не найден
79TUNNEL_INCOMPATIBLE_PROTOCOLНесовместимый протокол туннеля
83UNKNOWN_OUTBOUND_TAGНеизвестный outbound-тег

DELETE /profile/custom-subscriptions/:id/routing/configs/:config_type/:config_reference_id

Сбросить настройки маршрутизации для конкретного конфига подписки.

Rate Limit: 3 req / 2 sec

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки
config_typestringДаОдин из: user_config, paid_option_config, paid_option_index, cloud_server_config, auto_select
config_reference_idnumberДаReference ID конфига

Query Parameters

ParameterTypeRequiredDescription
config_indexnumberНетИндекс конфига (по умолчанию: 0)

Пример запроса

curl -X DELETE "https://api.stealthsurf.net/profile/custom-subscriptions/123/routing/configs/user_config/2?config_index=0" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: true
}

Ошибки

errorCodemessageКогда
3bad requestНевалидные данные запроса
27custom subscription not foundПодписка не найдена

GET /profile/custom-subscriptions/:id/routing/available-tunnels

Получить доступные конфиги для туннелей подписки (пересечение xray-совместимых конфигов пользователя и элементов подписки).

Rate Limit: глобальный (60 req/min)

URL Parameters

ParameterTypeRequiredDescription
idnumberДаID подписки

Query Parameters

ParameterTypeRequiredDescription
exclude_config_typestringНетТип конфига для исключения из результата
exclude_config_idnumberНетID конфига для исключения из результата

Пример запроса

curl -X GET "https://api.stealthsurf.net/profile/custom-subscriptions/123/routing/available-tunnels" \
  -H "Authorization: Bearer stlth_XXXXXXXX_YYYYYYYYYYYYYYYYYYYYYYYY"

Ответ

{
  status: true,
  statusCode: 200,
  data: Array<{
    config_type: string
    config_id: number
    config_index: number
    tag: string
    label: string
    protocol: string
  }>
}

Ошибки

errorCodemessageКогда
27custom subscription not foundПодписка не найдена

Помогла ли вам эта статья?

Содержание

ОбзорОбщие схемы разделаGET /profile/custom-subscriptionsПример запросаОтветGET /profile/custom-subscriptions/available-itemsПример запросаОтветGET /profile/custom-subscriptions/:idURL ParametersПример запросаОтветОшибкиPOST /profile/custom-subscriptionsRequest BodyПример запросаОтветОшибкиPATCH /profile/custom-subscriptions/:id/titleURL ParametersRequest BodyПример запросаОтветОшибкиPUT /profile/custom-subscriptions/:id/itemsURL ParametersRequest BodyПример запросаОтветОшибкиPATCH /profile/custom-subscriptions/:id/items/orderURL ParametersRequest BodyПример запросаОтветОшибкиPOST /profile/custom-subscriptions/:id/reset-keyURL ParametersПример запросаОтветОшибкиDELETE /profile/custom-subscriptions/:idURL ParametersПример запросаОтветОшибкиGET /profile/custom-subscriptions/:id/encrypted-subscription-linkURL ParametersПример запросаОтветОшибкиНастройки отображения подпискиGET /profile/custom-subscriptions/:id/display/settingsURL ParametersПример запросаОтветОшибкиPATCH /profile/custom-subscriptions/:id/display/settingsURL ParametersRequest BodyПример запросаОтветОшибкиXRay шаблон подпискиGET /profile/custom-subscriptions/:id/xray-template/settingsURL ParametersПример запросаОтветОшибкиPATCH /profile/custom-subscriptions/:id/xray-template/settingsURL ParametersRequest BodyПример запросаОтветОшибкиGET /profile/custom-subscriptions/:id/xray-template (устарело)URL ParametersПример запросаОтветОшибкиPUT /profile/custom-subscriptions/:id/xray-template (устарело)URL ParametersRequest BodyПример запросаОтветОшибкиDELETE /profile/custom-subscriptions/:id/xray-template (устарело)URL ParametersПример запросаОтветОшибкиУстройства подпискиGET /profile/custom-subscriptions/:id/devicesURL ParametersQuery ParametersПример запросаОтветОшибкиGET /profile/custom-subscriptions/:id/devices/settingsURL ParametersПример запросаОтветОшибкиPATCH /profile/custom-subscriptions/:id/devices/settingsURL ParametersRequest BodyПример запросаОтветОшибкиPATCH /profile/custom-subscriptions/:id/devices/:deviceId/titleURL ParametersRequest BodyПример запросаОтветОшибкиPATCH /profile/custom-subscriptions/:id/devices/:deviceId/blockedURL ParametersRequest BodyПример запросаОтветОшибкиDELETE /profile/custom-subscriptions/:id/devices/:deviceIdURL ParametersПример запросаОтветОшибкиDELETE /profile/custom-subscriptions/:id/devicesURL ParametersПример запросаОтветОшибкиМаршрутизация подпискиGET /profile/custom-subscriptions/:id/routing/configs/:config_type/:config_reference_idURL ParametersQuery ParametersПример запросаОтветОшибкиPUT /profile/custom-subscriptions/:id/routing/configs/:config_type/:config_reference_idURL ParametersQuery ParametersRequest BodyПример запросаОтветОшибкиDELETE /profile/custom-subscriptions/:id/routing/configs/:config_type/:config_reference_idURL ParametersQuery ParametersПример запросаОтветОшибкиGET /profile/custom-subscriptions/:id/routing/available-tunnelsURL ParametersQuery ParametersПример запросаОтветОшибки