Void API — твои домены, серверы и хостинг по REST.
Регистрация и продление доменов, Cloudflare и DNS, заказ и управление VPS-серверами и веб-хостингом — из своего кода, на том же аккаунте и балансе, что и бот.
Хостинг
виртуальный веб-хостинг с панельюХостинг-аккаунт — пользователь нашей панели HestiaCP с лимитами тарифа (сайты, диск, базы, почтовые ящики). Создаётся, пока ты ждёшь ответа: POST /hosting отвечает 201 с аккаунтом в статусе ACTIVE либо падает и возвращает деньги. Домен не обязан быть зарегистрирован у нас: направь его A-запись на ip или nameservers — на nameservers. Домен, купленный в Void, автоматически снимается со страницы парковки. Пароль панели отдаёт только GET /hosting/{id}/credentials.
# 1. тарифы и цены
curl -s "$API/hosting/catalogue" -H "Authorization: Bearer $VOID_KEY"
# 2. заказ (списывает срок, возвращает 201 + аккаунт, уже ACTIVE)
curl -s -X POST "$API/hosting" -H "Authorization: Bearer $VOID_KEY" \
-H "Content-Type: application/json" \
-d '{"plan":"web-start","domain":"example.org","period":"MONTH"}'
# 3. адрес панели, логин и пароль
curl -s "$API/hosting/$ID/credentials" -H "Authorization: Bearer $VOID_KEY"// call() — как в быстром старте
const { plans } = await call("GET", "/hosting/catalogue");
const hosting = await call("POST", "/hosting", { plan: plans[0].code, domain: "example.org", period: "MONTH" });
// направь example.org на hosting.ip (A-запись) или на hosting.nameservers
const { panelUrl, login, password } = await call("GET", `/hosting/${hosting.id}/credentials`);# call() — как в быстром старте
plans = call("GET", "/hosting/catalogue")["plans"]
hosting = call("POST", "/hosting", plan=plans[0]["code"], domain="example.org", period="MONTH")
# направь example.org на hosting["ip"] (A-запись) или на hosting["nameservers"]
creds = call("GET", f"/hosting/{hosting['id']}/credentials") # panelUrl, login, passwordТарифы в продаже с ценой каждого срока. available: false — продажи хостинга сейчас выключены, заказ ответит PROVIDER_DISABLED. Тарифы идут в порядке показа; id — то, на что ссылается Hosting.planId.
{ "ok": true, "data": { "available": true, "plans": [
{ "id": "8d2f…", "code": "web-start", "nameEn": "Start", "nameRu": "Старт", "sites": 1, "diskMb": 3072, "bandwidthGb": 0, "databases": 1, "mailboxes": 3,
"prices": { "MONTH": "10.00", "QUARTER": "29.25", "HALF_YEAR": "57.00", "YEAR": "111.00" } }, … ] } }Твои живые аккаунты (PENDING, ACTIVE, SUSPENDED), новые первыми. Не больше 50 на страницу.
{ "ok": true, "data": { "items": [ Hosting, … ], "total": 1, "offset": 0, "limit": 20 } }Списывает срок и создаёт аккаунт в панели с доменом в качестве первого сайта. Считается в лимит 20 / мин.
| тело | тип | |
|---|---|---|
planобязательно | string | code тарифа из каталога |
domainобязательно | string | домен сайта; один домен может жить только на одном хостинг-аккаунте |
periodобязательно | MONTH QUARTER HALF_YEAR YEAR | оплачиваемый срок |
{ "plan": "web-start", "domain": "example.org", "period": "YEAR" }Повторный заказ для того же домена после успешного первого вернёт 409 DOMAIN_UNAVAILABLE, так что повтор не купит аккаунт дважды.
Один аккаунт — см. Hosting.
Адрес панели, логин и пароль — единственное место, где отдаётся пароль.
{ "ok": true, "data": { "panelUrl": "https://…", "login": "wh3f9a1c", "password": "…" } }{ "autoRenew": true | false } — в момент истечения продлить на текущий срок с баланса; если денег не хватает, аккаунт приостанавливается. Только для ACTIVE / SUSPENDED. Возвращает аккаунт.
Сразу списывает periodPrice и продлевает expiresAt на один срок от более поздней из дат: текущего истечения или сейчас. Приостановленный аккаунт становится ACTIVE, пользователь панели разблокируется в течение нескольких минут. Каждый успешный вызов добавляет ещё один срок.
Все сроки продления с ценой по сегодняшним ставкам; current отмечает текущий срок аккаунта. Та же форма, что у серверов.
{ "ok": true, "data": [ { "period": "MONTH", "price": "10.00", "current": true }, { "period": "QUARTER", "price": "29.25", "current": false }, … ] }{ "period": "YEAR" } — меняет срок продления. Сейчас ничего не списывается, expiresAt не меняется; новый срок и его цена действуют со следующего продления, автоматического или ручного.
{ "plan": "web-plus" } — цена перехода на тариф побольше. Принимается только более дорогой тариф (меньший может не вместить то, что уже лежит на аккаунте, — это через поддержку). charge списывается сейчас: разница цены срока пропорционально остатку оплаченного срока; periodPrice — каждое продление после смены.
{ "ok": true, "data": { "hostingId": "c41e…", "planCode": "web-plus", "charge": "4.52", "periodPrice": "22.00", "period": "MONTH" } }{ "plan": "web-plus", "maxCharge": "4.52" } — сразу списывает разницу и тут же переключает пакет в панели; возвращает применённую квоту. Если цена теперь выше maxCharge, ничего не списывается, а вызов отвечает 400 UPGRADE_PRICE_CHANGED с details: { "charge" }. Если панель отказала в смене, деньги возвращаются, а прежний тариф восстанавливается.