Руководство по использованию Prostor
Ключи, подписки, deep links и интеграция сервера подписки
Дата последнего обновления: 11 августа 2026 г.
1. Как добавить ключ или подписку
Prostor принимает одиночные ключи подключения и ссылки на HTTP/HTTPS-подписки. Ссылка подписки должна возвращать список ключей в Base64 либо совместимый JSON с массивом outbounds.
- Скопируйте одиночный ключ или URL подписки целиком.
- Откройте главный экран Prostor.
- Нажмите «Из буфера» или «Добавить ключ». Приложение само определит, что было передано: ключ или подписка.
- На Android и iOS можно нажать кнопку QR и отсканировать QR-код с тем же значением.
- После импорта выберите сервер и запустите подключение.
Поддерживаемые значения
http://иhttps://— ссылка подписки;vless://,ss://,hy2://,hysteria2://— одиночные ключи на всех платформах;vmess://иtrojan://как прямые ссылки дополнительно поддерживаются Android; эти протоколы также могут приходить в совместимой JSON-подписке.
2. Добавление через deep link
Единый формат для Windows, macOS, iOS и Android:
prostor://add/<URL-encoded ключ или URL подписки>Пример со ссылкой подписки:
prostor://add/https%3A%2F%2Fsub.example.com%2Fs%2FdemoФормирование ссылки в JavaScript:
const source = 'https://sub.example.com/s/demo'
const deepLink = `prostor://add/${encodeURIComponent(source)}`?, &, # и вложенным ://. После открытия deep link приложение переходит на главный экран и запускает тот же импорт, что и кнопка «Из буфера». 3. Как удалить ключ или подписку
- Откройте главный экран со списком конфигураций.
- Для одиночного ключа нажмите крестик справа от строки сервера.
- Для подписки нажмите значок корзины в заголовке блока подписки и подтвердите удаление.
Удаление подписки удаляет из приложения саму ссылку и все полученные из неё серверы. Это локальная операция: она не отменяет тариф и не удаляет аккаунт у провайдера.
4. Интеграция сервера подписки
При добавлении или обновлении HTTP/HTTPS-подписки Prostor выполняет GET-запрос. Имена HTTP-заголовков регистронезависимы. Не кэшируйте персонализированный ответ только по URL: он может зависеть от X-Hwid и платформы.
4.1. Заголовки, которые отправляет приложение
| Заголовок | Платформы | Назначение | Пример |
|---|---|---|---|
User-Agent | Все платформы | Определяет клиент: Prostor/windows, Prostor/macos, Prostor/ios или Prostor/android. | Prostor/ios |
X-Hwid | Все платформы | Стабильный непрозрачный идентификатор устройства/установки. Сервер может использовать его для привязки подписки и ограничения числа устройств. | A1B2C3D4-… |
X-Device-Model | Все платформы | Тип или модель устройства, с которого запрашивается подписка. | iPhone |
X-App-Version | Все платформы | Версия приложения; на Apple-платформах включает номер сборки. | 1.0.0.2 |
X-Ver-Os | Все платформы | Версия операционной системы устройства. | 18.6 |
Cache-Control / Pragma | Все платформы | Запрещают отдавать закэшированную подписку. Серверу следует формировать актуальный ответ для каждого запроса. | no-cache, no-store, max-age=0 |
X-Hwid добавляется приложением автоматически. Сервер должен читать его из входящего запроса — возвращать этот заголовок в ответе не требуется. Считайте значение персональным техническим идентификатором: не публикуйте и не записывайте его целиком в общедоступные логи. Пример запроса подписки
GET /s/demo HTTP/1.1
Host: sub.example.com
User-Agent: Prostor/ios
X-Hwid: A1B2C3D4-…
X-Device-Model: iPhone
X-App-Version: 1.0.0.2
X-Ver-Os: 18.6
Cache-Control: no-cache, no-store, max-age=0
Pragma: no-cache4.2. Заголовки ответа, которые обрабатывает Prostor
Основные параметры задают название, срок действия, объявление и ссылки подписки. Расширенные параметры Sub-Info-* и Sub-Expire-* управляют информационным баннером и предупреждением о продлении. Дополнительный Provider ID для этих функций Prostor не требует.
| Заголовок | Платформы | Что делает приложение | Пример |
|---|---|---|---|
Subscription-Userinfo | Windows · macOS · iOS · Android | Метаданные подписки. expire — Unix timestamp в секундах и определяет срок действия. Стандартные upload, download и total допускаются, но сейчас не выводятся в интерфейсе. | upload=0; download=0; total=107374182400; expire=1798761600 |
Profile-Title | Windows · macOS · iOS · Android | Название подписки в приложении. Для одинаковой работы на всех платформах передавайте UTF-8 текст как base64:… | base64:UHJvc3RvciBEZW1v |
Announce | Windows · macOS · iOS · Android | Короткое обычное объявление под названием подписки. Значение должно иметь формат base64:<UTF-8 в Base64>. | base64:TmV3IHNlcnZlcnMgYXJlIGF2YWlsYWJsZS4= |
X-Hwid-Limit | Windows · macOS · iOS · Android | Если true и сервер не отдаёт валидную подписку, приложение показывает ошибку превышения лимита устройств вместо ошибки ключа. | true |
Profile-Update-Interval | Windows · Android | Период автоматического обновления подписки в часах, если автообновление включено пользователем. | 6 |
Support-Url | Windows · Android* | Ссылка поддержки провайдера. Windows показывает действие поддержки; Android сохраняет значение для совместимости. Значение None очищает ссылку. | https://example.com/support |
Profile-Web-Page-Url | Windows · Android* | Веб-страница подписки. Сейчас сохраняется в данных подписки; видимая кнопка есть не на всех платформах. Значение None очищает ссылку. | https://example.com/account |
Sub-Info-Color | Windows · macOS · iOS · Android | Цвет информационного баннера: blue, green или red. Неизвестное значение отображается фирменным синим. | blue |
Sub-Info-Text | Windows · macOS · iOS · Android | Текст цветного баннера, максимум 200 символов. Поддерживается обычный UTF-8 текст или base64:… | base64:0JTQvtCx0LDQstC70LXQvdGLINC90L7QstC60LDRhtC40Lg= |
Sub-Info-Button-Text | Windows · macOS · iOS · Android | Текст кнопки информационного баннера, максимум 25 символов. Кнопка появляется только вместе со ссылкой. | base64:0J/QvtC00YDQvtCx0L3QtdC1 |
Sub-Info-Button-Link | Windows · macOS · iOS · Android | Ссылка кнопки информационного баннера. Для совместимости и безопасности используйте HTTPS. | https://example.com/news |
Sub-Expire | Windows · macOS · iOS · Android | Включает предупреждение об окончании подписки. Значения true и 1 активируют баннер за 3 дня до expire; он временно заменяет Sub-Info-Text. | true |
Sub-Expire-Button-Link | Windows · macOS · iOS · Android | Ссылка кнопки «Продлить» в предупреждении об окончании подписки. | https://example.com/renew |
Звёздочка у Android означает, что значение распознаётся и сохраняется, но отдельное действие в текущем интерфейсе может отсутствовать. Для кроссплатформенной интеграции ориентируйтесь на строки, где перечислены все четыре платформы.
4.3. Формат HTTP-ответа
Prostor читает параметры подписки только из настоящих HTTP response headers. Формат одинаков для Windows, macOS, iOS и Android.
HTTP response headers — Windows, macOS, iOS и Android
Передавайте параметры вместе с успешным ответом подписки. Имена заголовков регистронезависимы.
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Cache-Control: no-store
Profile-Title: base64:UHJvc3RvciBEZW1v
Subscription-Userinfo: upload=0; download=0; total=107374182400; expire=1798761600
dmxlc3M6Ly9leGFtcGxlLWtleS0xX-Hwid-Limit передавайте true. Для Sub-Expire значения true и 1 означают «включено». 4.4. Полный пример HTTP-ответа
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Cache-Control: no-store
Profile-Title: base64:UHJvc3RvciBEZW1v
Subscription-Userinfo: upload=0; download=0; total=107374182400; expire=1798761600
Profile-Update-Interval: 6
Support-Url: https://example.com/support
Sub-Info-Color: blue
Sub-Info-Text: base64:TmV3IHNlcnZlcnMgYXJlIGF2YWlsYWJsZS4=
Sub-Info-Button-Text: base64:0J/QvtC00YDQvtCx0L3QtdC1
Sub-Info-Button-Link: https://example.com/news
Sub-Expire: true
Sub-Expire-Button-Link: https://example.com/renew
dmxlc3M6Ly9leGFtcGxlLWtleS0xCnZsZXNzOi8vZXhhbXBsZS1rZXktMg==4.5. Правила совместимости
- Для
Profile-TitleиAnnounceиспользуйтеbase64:и Base64 от UTF-8 строки. - Для ссылок используйте абсолютный
https://URL. expireпередавайте как Unix timestamp в секундах.- Информационный баннер появится, только если задан
Sub-Info-Text. - Кнопка информационного баннера появится, только если одновременно заданы её текст и ссылка.
- Предупреждение
Sub-Expireтребует корректногоexpireи показывается, когда осталось не более трёх дней.
5. Если импорт не сработал
- Проверьте, что ключ или URL скопирован полностью, без кавычек и пробелов по краям.
- Откройте URL подписки отдельно и убедитесь, что сервер возвращает непустое тело.
- Не возвращайте HTML-страницу авторизации вместо списка ключей.
- При ограничении устройств возвращайте
X-Hwid-Limit: trueи не отдавайте старую закэшированную подписку. - Для deep link проверьте percent-encoding всего вложенного значения.