H1Cloud API v1.0 Кабинет

REST API · v1.0

API личного кабинета

Управляйте услугами из кода: создавайте юзеров на своих VPN и LTE-серверах, получайте готовые ссылки и подписки, продлевайте серверы. Обычный HTTP и JSON, подойдёт для Telegram-бота или собственного магазина. Ключ равен вашему аккаунту: он видит только ваши серверы, покупки и списания через API невозможны.

Base URL
https://my.h1cloud.net
Аутентификация
Bearer h1_…
Формат
JSON · UTF-8

Ваши API-ключи

Ключи привязаны к аккаунту. Управлять ими можно, только когда вы вошли на сайте в этом браузере.

Проверяем сессию…

Быстрый старт

Три шага до первого запроса.

Создайте ключ

В блоке «Ваши API-ключи» выше нажмите «Создать ключ» и скопируйте значение h1_….

Передайте его в заголовке

Каждый запрос: с заголовком Authorization: Bearer h1_….

Дёрните любой эндпоинт

Например, получите список серверов:

curl -H "Authorization: Bearer h1_..." \
  https://my.h1cloud.net/api/v1/servers
import requests

BASE = "https://my.h1cloud.net"
KEY  = "h1_..."
r = requests.get(f"{BASE}/api/v1/servers",
                 headers={"Authorization": f"Bearer {KEY}"})
print(r.json())
const BASE = "https://my.h1cloud.net";
const KEY  = "h1_...";
const r = await fetch(`${BASE}/api/v1/servers`, {
  headers: { Authorization: `Bearer ${KEY}` }
});
console.log(await r.json());

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

Ключ передаётся в заголовке Authorization. Альтернатива: заголовок X-API-Key.

Authorization: Bearer h1_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Что можно ключом

Читать аккаунт и серверы, забирать конфиги, смотреть статистику, управлять питанием, перевыпускать конфиг, продлевать сервер с баланса.

Что нельзя

Покупать новые серверы, пополнять/списывать деньги произвольно, заходить в админку и создавать другие ключи. Это доступно только из кабинета под вашей сессией.

Логин по данным биллинга

Чтобы бот не зависел от ручного ключа с сайта, логиньтесь логином/почтой и паролем аккаунта, API вернёт ключ.

POST/api/v1/auth/token

Проверяет данные аккаунта и выдаёт API-ключ. Если на аккаунте включена TOTP-2FA: обязателен code. 2FA по email/Telegram через API не поддержана (в этом случае создайте ключ вручную выше).

Тело запроса (JSON)

ПолеТипОписание
login обяз.stringЛогин или e-mail аккаунта
password обяз.stringПароль от кабинета
code опц.stringКод TOTP-2FA, если включена
name опц.stringНазвание ключа (для списка)

Пример

curl -X POST https://my.h1cloud.net/api/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{"login":"my@mail.tld","password":"...","name":"bot"}'

Ответ

{ "ok": true, "key": "h1_xxxxxxxx...", "prefix": "h1_xxxxxxxx" }
Полученный ключ храните как пароль. Лимит: 20 активных ключей на аккаунт.

Формат ответов

Все ответы: JSON. Успех содержит "ok": true, ошибка: "ok": false и error. HTTP-код тоже отражает результат.

Успех

{
  "ok": true,
  "account": { "...": "..." }
}

Ошибка

{
  "ok": false,
  "error": "Требуется авторизация"
}

Свой бот на 3x-ui: клиенты (юзеры)

Это основной сценарий для реселлера: вы пишете своего бота на нашем API, а он сам заводит VPN-юзеров на вашем 3x-ui сервере и раздаёт им готовые ссылки. В отличие от Remnawave, тут панель: наша, на ноде, поэтому мы управляем клиентами за вас: вам не нужны ни своя панель, ни правка конфигов.

Как это работает

3x-ui-сервер = ваша панель на нашей ноде

Обход (BS) и CDN уже настроены нами при покупке. Вы работаете внутри готового инбаунда и просто добавляете в него юзеров через API.

Юзер = клиент на инбаунде

У каждого свой UUID, лимит трафика (gb) и срок (days). Имя юзера (name): просто метка; если не задать, сгенерим.

Создали → сразу получили рабочую ссылку

Ответ содержит готовую vless-ссылку с обходом и sub-ссылки. Отдаёте их клиенту, работает из коробки в v2rayNG / Hiddify / NekoBox, ничего собирать вручную не надо.

Ведёте юзеров

Смотрите их трафик, продлевайте срок, меняйте лимит, отключайте (бан) и удаляйте. Трафик всех юзеров списывается из общего LTE-пакета сервера.

Полный цикл в боте (пример)

# 1) завести юзера при оплате у вашего клиента
curl -X POST https://my.h1cloud.net/api/v1/servers/123/clients \
  -H "Authorization: Bearer h1_..." -H "Content-Type: application/json" \
  -d '{"name":"vasya","gb":50,"days":30}'
#    -> ответ содержит client.link (vless://...) и client.sub_links: отдаёте клиенту

# 2) показать остаток трафика
curl -H "Authorization: Bearer h1_..." \
  https://my.h1cloud.net/api/v1/servers/123/clients/vasya

# 3) продлить ещё на 30 дней
curl -X PATCH https://my.h1cloud.net/api/v1/servers/123/clients/vasya \
  -H "Authorization: Bearer h1_..." -H "Content-Type: application/json" -d '{"days":30}'

# 4) забанить неплательщика (не удаляя)
curl -X PATCH https://my.h1cloud.net/api/v1/servers/123/clients/vasya \
  -H "Authorization: Bearer h1_..." -H "Content-Type: application/json" -d '{"enable":false}'

# 5) удалить совсем
curl -X DELETE https://my.h1cloud.net/api/v1/servers/123/clients/vasya \
  -H "Authorization: Bearer h1_..."

{id}: id вашего 3x-ui сервера из /servers (у него xui_enabled: true). {email}: это name юзера.

GET/api/v1/servers/{id}/clients

Список юзеров инбаунда с трафиком (up/down), лимитом и сроком.

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

{
  "ok": true,
  "inbound_id": 1,
  "count": 2,
  "clients": [
    {
      "email": "vasya",
      "uuid": "0c7ade4b-....",
      "sub_id": "b5a16eda83270cb7",
      "enable": true,
      "total_gb": 5.0,
      "expiry_ms": 1785500000000,
      "up_bytes": 1048576,
      "down_bytes": 5242880
    }
  ]
}
POST/api/v1/servers/{id}/clients

Создать юзера. Возвращает готовую vless-ссылку (с рабочим обходом) и sub-ссылки: отдайте их клиенту.

Тело запроса (JSON)

ПолеТипОписание
name опц.stringИмя юзера (email в панели). Если пусто/занято: сгенерируем.
gb опц.numberЛимит трафика, ГБ. 0 = без лимита.
days опц.integerСрок в днях. 0 = бессрочно.

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

curl -X POST https://my.h1cloud.net/api/v1/servers/123/clients \
  -H "Authorization: Bearer h1_..." -H "Content-Type: application/json" \
  -d '{"name":"vasya","gb":50,"days":30}'

Ответ

{
  "ok": true,
  "client": {
    "email": "vasya",
    "uuid": "0c7ade4b-....",
    "sub_id": "b5a16eda83270cb7",
    "link": "vless://0c7ade4b-...@cdn.host:443?...&type=xhttp&...#vasya",
    "sub_links": ["vless://...", "vless://..."],
    "total_gb": 50.0,
    "expiry_days": 30
  }
}
GET/api/v1/servers/{id}/clients/{email}

Один юзер: статус, лимит, срок и израсходованный трафик (up/down в байтах).

PATCH/api/v1/servers/{id}/clients/{email}

Изменить юзера: продлить, поменять лимит трафика, включить/выключить (бан).

Тело запроса (JSON): любое из полей

ПолеТипОписание
gbnumberНовый лимит трафика, ГБ (0 = без лимита)
daysintegerНовый срок в днях от текущего момента (0 = бессрочно)
enablebooleanfalse: отключить (забанить), true: включить

Пример: забанить юзера

curl -X PATCH https://my.h1cloud.net/api/v1/servers/123/clients/vasya \
  -H "Authorization: Bearer h1_..." -H "Content-Type: application/json" \
  -d '{"enable":false}'
DELETE/api/v1/servers/{id}/clients/{email}

Удалить юзера с инбаунда. Его ссылка перестаёт работать.

GET/api/v1/servers/{id}/inbounds

Список инбаундов панели: id, remark, порт, протокол, сеть, путь и число клиентов.

Топология инбаундов (порты, CDN, маршруты обхода) настроена нами, юзеров вы ведёте внутри готового BS-инбаунда. Нужно больше локаций: берите ещё сервер.

Remnawave (remnanode)

Remnanode-серверы устроены иначе, чем 3x-ui: это xray-нода, а юзеров вставляет Remnawave-панель (по сквадам). Панель ваша, поэтому юзеров вы заводите в ней, а наш API даёт то, что нужно ей на вход: Config Profile.

  • Забрать конфиг: GET /api/v1/servers/{id}/config вернёт Xray Config Profile (JSON): импортируйте его в свою Remnawave-панель как ноду. Инбаунды идут с clients: []: юзеров добавляет панель.
  • Создать новый конфиг: POST /api/v1/servers/{id}/config/regenerate сгенерит свежие reality-ключи и вернёт новый профиль в поле profile. Переимпортируйте его, старые ключи перестают действовать.
  • Юзеры/лимиты/трафик у remnanode: на стороне вашей Remnawave-панели (её API), не через нас. Наши client-эндпоинты (/clients) работают только для 3x-ui.

Забрать профиль

curl -H "Authorization: Bearer h1_..." \
  https://my.h1cloud.net/api/v1/servers/123/config -o profile.json

Серверы и аккаунт

GET/api/v1/me

Данные вашего аккаунта: Telegram-ID, никнейм, баланс и число серверов.

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

{
  "ok": true,
  "account": {
    "tgid": 123456789,
    "username": "example_user",
    "balance": 1520.50,
    "servers_total": 3
  }
}
GET/api/v1/servers

Все ваши серверы. Чувствительные поля (пароли панели) не отдаются, за ними идите в /config.

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

{
  "ok": true,
  "servers": [
    {
      "id": 123,
      "name": "3x-ui (bs)",
      "tariff_id": "vpn-nl",
      "tariff_name": "Нидерланды",
      "status": "active",
      "days_left": 21,
      "expiration_date": "2026-08-03 12:00:00",
      "cpu": 100, "memory": 512, "disk": 5120,
      "vpn_bs_enabled": true,
      "xui_enabled": true,
      "remnanode_enabled": false
    }
  ]
}

Поле status: active · expired · suspended.

GET/api/v1/servers/{id}

Подробности одного сервера: тот же объект, что и в списке.

Параметры пути

ПараметрТипОписание
id обяз.integerID сервера из /servers
GET/api/v1/servers/{id}/config

Готовый VPN-конфиг для сервера. Эндпоинт сам определяет тип и возвращает нужное: для 3x-ui: данные панели, для Remnawave (remnanode): Xray Config Profile (JSON), который вы импортируете в свою Remnawave-панель. Идемпотентно.

Нужны привязанный e-mail и никнейм в аккаунте, иначе вернётся 403. Если для сервера ещё не куплен LTE-доступ, придёт 402. Про remnanode: см. раздел Remnawave ниже.

Пример ответа (3x-ui за CDN)

{
  "ok": true,
  "manual_client": true,
  "panel_url": "http://203.0.113.10:25214/aB3xYz9QwErT4uIo",
  "username": "u7Kp2mQx9RtL",
  "password": "eXaMpLePaSsW0rD1",
  "web_path": "aB3xYz9QwErT4uIo",
  "node_address": "203.0.113.10"
}
POST/api/v1/servers/{id}/config/regenerate

Создать свежий конфиг. Для 3x-ui: новый инбаунд (клиенты на старом перестанут работать). Для Remnawave (remnanode): новые reality-ключи и новый Config Profile (в ответе поле profile): импортируйте его в свою Remnawave-панель заново.

Действие необратимо: старые ключи/ссылки перестают действовать. Раздайте/переимпортируйте новый конфиг.

Пример ответа (remnanode)

{
  "ok": true,
  "regenerated": true,
  "kind": "remnanode",
  "profile": { "log": {...}, "inbounds": [ ... ] }
}
GET/api/v1/servers/{id}/stats

Live-статистика из панели: состояние (running/offline), загрузка CPU и RAM, аптайм.

POST/api/v1/servers/{id}/power

Управление питанием сервера.

Тело запроса (JSON)

ПолеТипЗначения
action обяз.stringstart · stop · restart

Пример

curl -X POST https://my.h1cloud.net/api/v1/servers/123/power \
  -H "Authorization: Bearer h1_..." \
  -H "Content-Type: application/json" \
  -d '{"action":"restart"}'
POST/api/v1/servers/{id}/xray-update

Поменять версию ядра Xray сервера: то же самое, что кнопка «Поменять версию Xray (обход)» в кабинете. Версия ядра сервера должна совпадать с версией ядра Xray клиентского приложения (Happ), иначе туннель подключается, но трафик не идёт. Тело запроса: {"version": "26.6.27"}, {"version": "26.7.28"} или {"version": "26.7.11"}; без тела ставится 26.6.27.

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

Пример

curl -X POST https://my.h1cloud.net/api/v1/servers/123/xray-update \
  -H "Authorization: Bearer h1_..." \
  -H "Content-Type: application/json" \
  -d '{"version":"26.6.27"}'

Возможные ошибки: 503: сервер не запущен (подождите ~30 секунд), 409: на сервере нет блока пина ядра (напишите в поддержку), 502: не удалось прочитать/записать файлы сервера.

POST/api/v1/servers/{id}/renew

Продлить сервер на 30 дней списанием с баланса. Другие способы оплаты через API недоступны: если баланса не хватает, вернётся ошибка 400, деньги не списываются.

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

{
  "ok": true,
  "message": "Сервер продлён на 30 дней",
  "balance": 1220.50,
  "server": { "id": 123, "days_left": 51, "...": "..." }
}

Коды ошибок

При ошибке HTTP-статус отражает причину, а тело содержит error с человекочитаемым текстом.

КодЗначение
401Ключ отсутствует, недействителен или отозван
402Для действия нужен купленный LTE-доступ на сервере
403Не выполнены требования аккаунта (привяжите e-mail и никнейм)
404Сервер не найден или не принадлежит вам
400Некорректный запрос (например, не хватает баланса на продление)
502 / 503Панель/нода временно недоступна: повторите позже

Безопасность

  • Ключ = доступ к вашим серверам. Храните его как пароль, не публикуйте в коде/репозиториях.
  • Полное значение ключа показывается один раз: при создании. Потеряли: создайте новый и отзовите старый.
  • Скомпрометирован? Нажмите «Отозвать» в блоке ключей: он мгновенно перестанет работать.
  • До 20 активных ключей на аккаунт. Заведите отдельный ключ под каждый скрипт/сервис.
  • Ключом нельзя тратить деньги произвольно и заходить в админку, доступно только чтение и управление вашими серверами.

Полезное

  • Готовый конфиг и веб-панель сервера: в личном кабинете, раздел «Мои серверы».
  • Управление ключами и этот гайд: на /api-docs (также кнопка «API-доступ» в разделе «Аккаунт» кабинета).
H1Cloud API · v1.0 · Вопросы и лимиты: через поддержку в кабинете.