---
title: "API Tihost: как автоматизировать покупку и управление VPS"
description: "Публичный API Tihost: ключ в панели или боте, покупка сервера через POST /servers, перезагрузка, продление, лимиты 60/10 в минуту, примеры на curl и Python."
url: https://tihost.io/blog/tihost-api-automation
language: ru
section: "Платформа"
published: 2026-10-05
updated: 2026-10-05
publisher: Tihost (https://tihost.io)
---

# API Tihost: как автоматизировать покупку и управление VPS

> **Коротко:** API Tihost - это HTTP API с JSON по адресу https://api-public.tihost.io/v1: ключ выпускается в разделе «API» панели или в боте и передаётся в заголовке Authorization: Bearer. Через API можно купить сервер (POST /servers), продлить его, перезагрузить, переустановить ОС и сменить пароль; лимит - 60 запросов на чтение и 10 на запись в минуту на ключ.

**Главное:**

- Публичный API Tihost работает по адресу https://api-public.tihost.io/v1, принимает и отдаёт JSON, а ключ доступа передаётся в заголовке `Authorization: Bearer <ключ>`.
- Ключ API Tihost выпускается в разделе «API» веб-панели кнопкой «Выпустить ключ» или в Telegram-боте через «Профиль» - «API-ключ»; значение показывается один раз.
- Лимит API Tihost считается на ключ: 60 запросов в минуту на чтение и 10 в минуту на методы, которые меняют серверы или списывают деньги; при превышении приходит ответ 429 с заголовком Retry-After.
- Покупка (POST /servers) и продление (POST /servers/{id}/renew) через API Tihost списывают деньги с баланса, поэтому их отправляют с заголовком Idempotency-Key - повтор с тем же ключом не купит второй сервер.

Полное описание каждого метода, всех полей ответа и кодов ошибок - на странице [документации API](https://tihost.io/api). Здесь - быстрый путь от ключа до купленного и перезагруженного сервера.

## Что можно делать через API Tihost

| Метод | Путь | Что делает |
| --- | --- | --- |
| GET | `/ping` | Проверяет ключ, возвращает id аккаунта и время сервера |
| GET | `/balance` | Баланс аккаунта в долларах |
| GET | `/catalog/plans?location=…` | Конфигурации в локации и цены за 1, 3, 6 и 12 месяцев |
| GET | `/catalog/os?location=…&plan_id=…` | Образы ОС для выбранной конфигурации |
| POST | `/servers` | Покупка сервера - списывает деньги |
| GET | `/servers` | Список серверов аккаунта |
| GET | `/servers/{id}` | Один сервер: IP, состояние, ресурсы, цены продления |
| POST | `/servers/{id}/renew` | Продление на 2, 7, 30, 90, 180 или 365 дней - списывает деньги |
| PATCH | `/servers/{id}/auto-renew` | Включает или выключает автопродление |
| POST | `/servers/{id}/power` | Включение, выключение, перезагрузка |
| PATCH | `/servers/{id}/name` | Смена имени сервера |
| POST | `/servers/{id}/password` | Смена пароля root или Administrator |
| GET | `/servers/{id}/os` | Образы, которые можно поставить на сервер |
| POST | `/servers/{id}/reinstall` | Переустановка ОС - стирает диск |
| GET | `/servers/{id}/scripts` | Скрипты, доступные для ОС сервера |
| POST | `/servers/{id}/scripts/run` | Запуск скрипта на сервере |

*Пути указаны относительно базы https://api-public.tihost.io/v1. Пополнить баланс и сменить IP-адрес через API нельзя - это делается в панели или боте.*

## Шаг 1. Выпустите ключ API

В [панели](https://tihost.io/login) откройте раздел «API» и нажмите «Выпустить ключ»; в боте @tihost_bot то же самое - «Профиль» - «API-ключ». Ключ начинается с `tih_`, действует бессрочно и показывается один раз: на сервере хранится только его хеш, поэтому сразу сохраните его в менеджер паролей или переменную окружения. У аккаунта один ключ; кнопка «Перевыпустить» мгновенно отключает старый.

> Ключ даёт доступ ко всему аккаунту, включая покупки с баланса. Не кладите его в клиентский код, публичные репозитории и чаты - храните в переменной окружения или секретах CI.

## Шаг 2. Проверьте ключ методом /ping

Сохраните ключ и базовый адрес в переменные окружения и вызовите `/ping` - он ничего не меняет и только подтверждает, что ключ рабочий. Вместо `YOUR_API_KEY` подставьте свой ключ:

```bash
export TIHOST_TOKEN="YOUR_API_KEY"
export TIHOST_API="https://api-public.tihost.io/v1"

curl -H "Authorization: Bearer $TIHOST_TOKEN" "$TIHOST_API/ping"
```

`Ответ`:

```
{
  "status": "ok",
  "account_id": 1042,
  "server_time": "2026-10-05T12:30:00Z"
}
```

## Шаг 3. Узнайте баланс, тарифы и образы ОС

Перед покупкой нужны два идентификатора: `plan_id` конфигурации из `/catalog/plans` и `os_id` образа из `/catalog/os`. Числа 41 и 101 в примерах условные - берите их из ответа каталога, а не из статьи. Код локации - `germany`, `finland` или `poland`:

```bash
curl -H "Authorization: Bearer $TIHOST_TOKEN" "$TIHOST_API/balance"
curl -H "Authorization: Bearer $TIHOST_TOKEN" "$TIHOST_API/catalog/plans?location=germany"
curl -H "Authorization: Bearer $TIHOST_TOKEN" "$TIHOST_API/catalog/os?location=germany&plan_id=41"
```

Каталог возвращает для каждой конфигурации `cpu`, `ram_mb`, `disk_gb` и массив `periods` с итоговой суммой за 1, 3, 6 и 12 месяцев - скидки 10, 15 и 20% там уже учтены.

## Шаг 4. Купите сервер

Покупка - `POST /servers` с локацией, `plan_id`, `os_id` и сроком `months` (1, 3, 6 или 12); необязательное поле `name` задаёт имя сервера. Стоимость списывается с баланса, поэтому сгенерируйте `Idempotency-Key` один раз и при повторе после таймаута отправьте тот же ключ - API вернёт сохранённый ответ и не создаст вторую машину:

```bash
IDEMPOTENCY_KEY=$(uuidgen)   # на Linux без uuidgen: cat /proc/sys/kernel/random/uuid

curl -X POST "$TIHOST_API/servers" \
  -H "Authorization: Bearer $TIHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{"location": "germany", "plan_id": 41, "os_id": 101, "months": 1}'
```

`Ответ 201`:

```
{
  "id": 2427,
  "name": "my-server-1",
  "os": "Ubuntu 24.04",
  "location": "germany",
  "login": "root",
  "password": "********",
  "rent_expires_at": "2026-11-04T10:00:00Z",
  "charged_usd": "4.00",
  "balance_usd": "6.00"
}
```

В ответе сразу есть `login` и `password`, а IP-адреса ещё нет: машина разворачивается примерно 2 минуты. IP и состояние читайте через `GET /servers/{id}`. Если денег не хватает, придёт ошибка 402 `insufficient_funds` с недостающей суммой в `details.missing_usd`.

## Шаг 5. Управляйте серверами: список, перезагрузка, продление

Читающие методы (`GET`) безопасно вызывать в цикле, а пишущие (`POST` и `PATCH`) принимают тот же заголовок `Idempotency-Key`. Команды питания панель выполняет асинхронно: ответ `power` сообщает, в какое состояние переходит машина (`running`, `stopped` или `restarting`), а фактическое состояние видно в `GET /servers/{id}`:

```bash
# все серверы аккаунта
curl -H "Authorization: Bearer $TIHOST_TOKEN" "$TIHOST_API/servers"

# один сервер: IP, состояние, ресурсы, цены продления
curl -H "Authorization: Bearer $TIHOST_TOKEN" "$TIHOST_API/servers/2427"

# перезагрузка (action: start, stop или restart)
curl -X POST "$TIHOST_API/servers/2427/power" \
  -H "Authorization: Bearer $TIHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"action": "restart"}'

# продление на 30 дней с баланса
curl -X POST "$TIHOST_API/servers/2427/renew" \
  -H "Authorization: Bearer $TIHOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"days": 30}'
```

## Пример на Python: купить сервер и дождаться IP

Скрипт на библиотеке `requests` (`pip install requests`) выбирает конфигурацию 1 vCPU / 2 ГБ в Германии, покупает её на месяц с Ubuntu и ждёт IP-адрес. Ключ берётся из переменной окружения `TIHOST_TOKEN`, ответ 429 обрабатывается паузой на `Retry-After` секунд:

`buy_server.py`:

```python
import os
import time
import uuid

import requests

BASE = "https://api-public.tihost.io/v1"
TOKEN = os.environ["TIHOST_TOKEN"]  # YOUR_API_KEY - из переменной окружения, не из кода


def api(method, path, body=None, idempotency_key=None):
    headers = {"Authorization": f"Bearer {TOKEN}"}
    if idempotency_key:
        headers["Idempotency-Key"] = idempotency_key
    while True:
        r = requests.request(method, BASE + path, headers=headers, json=body, timeout=30)
        if r.status_code == 429:  # лимит: ждём, сколько сказал сервер
            time.sleep(int(r.headers.get("Retry-After", "5")))
            continue
        if not r.ok:
            err = r.json()["error"]
            raise RuntimeError(f"{err['code']}: {err['message']} (request_id={err['request_id']})")
        return r.json()


# 1. Конфигурация 1 vCPU / 2 GB в Германии и Ubuntu для неё
plans = api("GET", "/catalog/plans?location=germany")["items"]
plan = next(p for p in plans if p["cpu"] == 1 and p["ram_mb"] == 2048)
images = api("GET", f"/catalog/os?location=germany&plan_id={plan['id']}")["items"]
os_id = next(i["id"] for i in images if i["name"].startswith("Ubuntu"))

# 2. Покупка на месяц. Ключ повтора - один на покупку: повтор не купит второй сервер
order = api(
    "POST",
    "/servers",
    body={"location": "germany", "plan_id": plan["id"], "os_id": os_id, "months": 1},
    idempotency_key=str(uuid.uuid4()),
)
print("login:", order["login"], "password:", order["password"])

# 3. Ждём IP-адрес (до 10 минут, опрос раз в 15 секунд)
for _ in range(40):
    server = api("GET", f"/servers/{order['id']}")
    if server["ip"]:
        print("ip:", server["ip"], "state:", server["state"])
        break
    time.sleep(15)
```

## Ошибки и лимиты API Tihost

Любая ошибка приходит в одном формате - объекте `error` с полями `code`, `message`, `request_id` и иногда `details`. Ветвитесь по `code`: он стабильный, а текст `message` может меняться.

`Ответ 429`:

```
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded: 60 read requests per 60 seconds",
    "details": { "limit": 60, "scope": "read", "retry_after": 27 },
    "request_id": "9f4c1d0e8b7a4c2f9e1d3b6a8c5f2e7d"
  }
}
```

| HTTP | code | Что значит |
| --- | --- | --- |
| 400 | `invalid_request` | Запрос не прошёл проверку, причины - в `details.fields` |
| 401 | `unauthorized`, `token_invalid` | Нет заголовка Authorization или ключ отозван |
| 402 | `insufficient_funds` | Не хватает денег на балансе |
| 404 | `not_found` | Сервера нет или он принадлежит другому аккаунту |
| 409 | `server_busy`, `rent_expired`, `conflict` | Машина занята другой операцией, аренда истекла или действие невозможно в текущем состоянии |
| 422 | `idempotency_key_reused` | Тот же Idempotency-Key отправлен с другим запросом |
| 429 | `rate_limited` | Превышен лимит - повторите через Retry-After секунд |

*Полный список кодов - на странице документации API.*

- Лимит - 60 запросов в минуту на чтение и 10 в минуту на запись, на каждый ключ отдельно; окна независимы, поток чтения не блокирует управление.
- Каждый ответ несёт заголовки `X-RateLimit-Limit`, `X-RateLimit-Remaining` и `X-RateLimit-Reset`, так что скрипт может притормозить до отказа.
- Ключ повтора (`Idempotency-Key`) - строка до 128 символов, обычно UUID; он живёт сутки, а ответ-повтор помечен заголовком `Idempotent-Replay: true`.
- Версия API - в адресе (`/v1`): в её рамках поля могут добавляться, но не переименовываются и не удаляются.
- Если ответ выглядит неправильно, напишите на tech-support@tihost.io и приложите `request_id` - по нему находится конкретный вызов.

> Прежний адрес https://tihost.io/api/public/v1 объявлен устаревшим и скоро будет отключён. Используйте базу https://api-public.tihost.io/v1 - актуальный адрес всегда показан на странице [документации API](https://tihost.io/api) и в разделе «API» панели.

**Запустите сервер за 2 минуты.** AMD Ryzen 9, NVMe и защита от DDoS в Германии, Финляндии и Польше. Оплата криптовалютой или картой. [Заказать сервер](https://tihost.io/login)

## Частые вопросы

### Где взять ключ API Tihost?

В веб-панели tihost.io: раздел «API» - кнопка «Выпустить ключ». В Telegram-боте @tihost_bot ключ выпускается через «Профиль» - «API-ключ». Значение показывается один раз, потом его можно только перевыпустить.

### Можно ли купить VPS через API Tihost?

Да, методом POST /servers с полями location, plan_id, os_id и months; стоимость списывается с баланса аккаунта. Идентификаторы конфигурации и образа берутся из GET /catalog/plans и GET /catalog/os.

### Как перезагрузить сервер через API Tihost?

Отправьте POST /servers/{id}/power с телом {"action": "restart"} и заголовком Authorization: Bearer. Значения start и stop включают и выключают сервер.

### Какие лимиты у API Tihost?

60 запросов в минуту на чтение и 10 в минуту на методы, которые меняют серверы или списывают деньги, - на каждый ключ отдельно. При превышении приходит ответ 429 с кодом rate_limited и заголовком Retry-After.

### Что будет, если повторить запрос на покупку после таймаута?

Если повтор отправлен с тем же заголовком Idempotency-Key, API Tihost вернёт сохранённый ответ первой покупки и не создаст второй сервер. Без этого заголовка повтор купит ещё одну машину.

### Можно ли пополнить баланс или сменить IP через API Tihost?

Нет. Пополнение баланса и смена IP-адреса доступны только в веб-панели и Telegram-боте; API работает с уже пополненным балансом.

---

Обновлено 2026-10-05 · https://tihost.io/blog/tihost-api-automation
