API / Справочник методов / Аренда и продление

Аренда и продление

Список услуг, аренда, продление и смена тарифа.

GET/projects/:id/services

Список услуг проекта

Серверы, FastDL, выделенные IP: статус, адрес, цена, следующая оплата.

Право: servers:read
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
Пример запроса
curl "https://sourhost.net/api/v1/projects/12/services" \
  -H "Authorization: Bearer $SOURHOST_TOKEN"
Ответ
HTTP
HTTP/2 200 OK
{
  "items": [
    {
      "id": "34",
      "type": "game_server",
      "name": "Retake #1",
      "game": "Counter-Strike 2",
      "tariff": "CS2 · 16 слотов",
      "location": "Германия · Франкфурт",
      "status": "active",
      "powerState": "running",
      "address": "203.0.113.10:27015",
      "price": 300,
      "billingMonths": 1,
      "nextPayment": "2026-12-01"
    }
  ]
}
POST/projects/:id/services

Арендовать игровой сервер

Параметры берутся из GET /catalog. Сначала отправьте с preview: true, чтобы узнать цену.

Право: billing:spendСписывает деньги · нужен Idempotency-Key
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
gameIdобязательныйbody · stringИгра из каталога
modeобязательныйbody · stringtariff, slots или builder
locationId / nodeIdобязательныйbody · stringЛокация и нода из каталога
tariffCode / slots / cores, ramMb, ssdGbbody · string / numberПлан для выбранного mode
monthsbody · number1, 3, 6 или 12; по умолчанию — текущий срок
previewbody · booleantrue — только посчитать цену, ничего не списывать
Пример запроса
curl -X POST "https://sourhost.net/api/v1/projects/12/services" \
  -H "Authorization: Bearer $SOURHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: extend-34-2026-11" \
  -d '{"gameId":"cs2","mode":"tariff","locationId":"de","nodeId":"de-n3","tariffCode":"cs2-16","months":1,"preview":true}'
Ответ
HTTP
HTTP/2 200 OK
{
  "total": 300,
  "server": 300,
  "fastdl": 0,
  "months": 1,
  "monthly": 300,
  "name": "CS2 · 16 слотов"
}
Ошибки метода
409node_fullНа ноде нет места
409ip_sold_outНет свободных выделенных IP
400idempotency_key_requiredНет заголовка Idempotency-Key
402insufficient_balanceНе хватает денег на балансе
403token_spend_limitПревысит лимит трат токена
409idempotency_in_progressЗапрос с этим ключом ещё выполняется
POST/projects/:id/services/:serviceId/extend

Продлить услугу

Право: billing:spendСписывает деньги · нужен Idempotency-Key
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
serviceIdобязательныйpath · stringНомер услуги (из GET /projects/:id/services)
monthsbody · number1, 3, 6 или 12; по умолчанию — текущий срок
previewbody · booleantrue — только посчитать цену, ничего не списывать
Пример запроса
curl -X POST "https://sourhost.net/api/v1/projects/12/services/34/extend" \
  -H "Authorization: Bearer $SOURHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: extend-34-2026-11" \
  -d '{"months":3,"preview":true}'
Ответ
HTTP
HTTP/2 200 OK
{
  "total": 855,
  "monthly": 285,
  "base": 300
}
Ошибки метода
400idempotency_key_requiredНет заголовка Idempotency-Key
402insufficient_balanceНе хватает денег на балансе
403token_spend_limitПревысит лимит трат токена
409idempotency_in_progressЗапрос с этим ключом ещё выполняется
POST/projects/:id/services/extend-all

Продлить все серверы проекта

Право: billing:spendСписывает деньги · нужен Idempotency-Key
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
monthsbody · number1, 3, 6 или 12; по умолчанию — текущий срок
previewbody · booleantrue — только посчитать цену, ничего не списывать
Пример запроса
curl -X POST "https://sourhost.net/api/v1/projects/12/services/extend-all" \
  -H "Authorization: Bearer $SOURHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: extend-34-2026-11" \
  -d '{"preview":true}'
Ответ
HTTP
HTTP/2 200 OK
{
  "items": [
    {
      "id": "34",
      "total": 300,
      "monthly": 300,
      "base": 300
    }
  ]
}
Ошибки метода
400idempotency_key_requiredНет заголовка Idempotency-Key
402insufficient_balanceНе хватает денег на балансе
403token_spend_limitПревысит лимит трат токена
409idempotency_in_progressЗапрос с этим ключом ещё выполняется
GET/projects/:id/services/:serviceId/plan-options

Варианты смены тарифа

Право: servers:read
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
serviceIdобязательныйpath · stringНомер услуги (из GET /projects/:id/services)
Пример запроса
curl "https://sourhost.net/api/v1/projects/12/services/34/plan-options" \
  -H "Authorization: Bearer $SOURHOST_TOKEN"
Ответ
204 Пустой ответ
POST/projects/:id/services/:serviceId/plan

Сменить тариф

Разница за оставшийся срок списывается или возвращается сразу. Сервер должен быть остановлен.

Право: billing:spendСписывает деньги · нужен Idempotency-Key
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
serviceIdобязательныйpath · stringНомер услуги (из GET /projects/:id/services)
modeобязательныйbody · stringtariff, slots или builder
tariffCode / slots / cores, ramMb, ssdGbbody · string / numberНовый план
previewbody · booleantrue — только посчитать цену, ничего не списывать
Пример запроса
curl -X POST "https://sourhost.net/api/v1/projects/12/services/34/plan" \
  -H "Authorization: Bearer $SOURHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: extend-34-2026-11" \
  -d '{"mode":"tariff","tariffCode":"cs2-24","preview":true}'
Ответ
HTTP
HTTP/2 200 OK
{
  "tariff": "CS2 · 24 слота",
  "price": 420,
  "chargeOrCredit": 96,
  "daysLeft": 24,
  "nextPaymentAt": "2026-12-01"
}
Ошибки метода
400idempotency_key_requiredНет заголовка Idempotency-Key
402insufficient_balanceНе хватает денег на балансе
403token_spend_limitПревысит лимит трат токена
409idempotency_in_progressЗапрос с этим ключом ещё выполняется
POST/projects/:id/services/fastdl

Арендовать FastDL

Право: billing:spendСписывает деньги · нужен Idempotency-Key
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
Пример запроса
curl -X POST "https://sourhost.net/api/v1/projects/12/services/fastdl" \
  -H "Authorization: Bearer $SOURHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: extend-34-2026-11" \
  -d '{"planCode":"fastdl-10","name":"Карты турнира"}'
Ответ
204 Пустой ответ
Ошибки метода
400idempotency_key_requiredНет заголовка Idempotency-Key
402insufficient_balanceНе хватает денег на балансе
403token_spend_limitПревысит лимит трат токена
409idempotency_in_progressЗапрос с этим ключом ещё выполняется
POST/projects/:id/services/dedicated-ip

Арендовать выделенный IP

Право: billing:spendСписывает деньги · нужен Idempotency-Key
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
Пример запроса
curl -X POST "https://sourhost.net/api/v1/projects/12/services/dedicated-ip" \
  -H "Authorization: Bearer $SOURHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: extend-34-2026-11" \
  -d '{"nodeId":"de-n3","months":1}'
Ответ
204 Пустой ответ
Ошибки метода
400idempotency_key_requiredНет заголовка Idempotency-Key
402insufficient_balanceНе хватает денег на балансе
403token_spend_limitПревысит лимит трат токена
409idempotency_in_progressЗапрос с этим ключом ещё выполняется
DELETE/projects/:id/services/:serviceId

Удалить услугу

Сервер и его файлы удаляются без возврата.

Право: servers:delete
Параметры
idобязательныйpath · stringНомер проекта (из GET /projects) или тикета
serviceIdобязательныйpath · stringНомер услуги (из GET /projects/:id/services)
Пример запроса
curl -X DELETE "https://sourhost.net/api/v1/projects/12/services/34" \
  -H "Authorization: Bearer $SOURHOST_TOKEN"
Ответ
204 Пустой ответ

Общие ошибки

Любой метод может ответить так. Подробнее об ошибках

400bad_requestНеверное тело или параметры
401token_invalidТокен неверный, отозван или просрочен
403token_scope_missingУ токена нет нужного права
403token_project_forbiddenПроект или услуга вне ограничений токена
404not_foundНет такого проекта, услуги или объекта
429token_rate_limitedСлишком много запросов, см. Retry-After
503upstream_unavailableПанель или нода не ответили — повторите позже