Все запросы требуют ключ в заголовке. Ключ действует бессрочно, пока вы его не перевыпустите или не удалите
Заголовок
Тип
Обязателен
Значения
Описание
Authorization
string
да
Bearer <token>
Ключ доступа. Схема Bearer, регистр схемы не важен
Idempotency-Key
string
нет
1…128
Ключ повтора для пишущих методов. Любая строка до 128 символов, обычно uuid
Значение ключа показывается один раз при выпуске - на сервере хранится только его хеш
Ключ даёт доступ ко всему аккаунту, поэтому не кладите его в клиентский код и публичные репозитории
Перевыпуск отключает старый ключ мгновенно
Лимиты
Лимит считается на ключ и раздельно по назначению: 60 запросов в минуту на чтение и 10 в минуту на методы, меняющие состояние. Окна независимы - поток чтения не блокирует управление. Заголовки лимита приходят с каждым ответом, а не только при отказе
Заголовок
Тип
Значения
Описание
X-RateLimit-Limit
integer
60 · 10
Порог окна: 60 для чтения, 10 для методов, меняющих состояние
X-RateLimit-Remaining
integer
0…60 · 0…10
Сколько запросов осталось в текущем окне
X-RateLimit-Reset
integer
-
Unix-время начала следующего окна
Retry-After
integer
1…61
Через сколько секунд повторить. Только при 429
X-Request-Id
string
-
Идентификатор вызова. Приходит с каждым ответом
Idempotent-Replay
string
true
Есть только на ответе-повторе: операция НЕ выполнялась заново
Повторы
Пишущие методы принимают заголовок Idempotency-Key. Повтор с тем же ключом вернёт сохранённый ответ и НЕ выполнит операцию заново
Ключ нужен там, где повтор опасен: покупка и продление списывают деньги, и обычный ретрай после таймаута купит второй сервер или спишет за продление дважды
Ключ живёт сутки и уникален в пределах вашего ключа доступа. Обычно это uuid, сгенерированный перед вызовом
Повторный ответ помечен заголовком Idempotent-Replay: true. Тот же ключ с ДРУГИМ телом - ошибка idempotency_key_reused
Методы
Ответ всегда объект: в него можно добавить поле, не сломав ваш код. Метки у методов говорят, что метод делает с аккаунтом - читает, меняет машину или тратит деньги
Показать:
GET/ping
Проверка ключа и связи. Возвращает идентификатор аккаунта и время сервера
Любая ошибка приходит в одном конверте. Завязывайтесь на поле code - оно машинное и стабильное, message может меняться
HTTP 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"}}
Поля конверта
Поле
Тип
Всегда есть
Значения
Описание
error
object
да
-
Единственный ключ верхнего уровня при ошибке. Успешные ответы его не содержат
code
string
да
-
Машинный код ошибки. Стабилен - завязывайтесь на него
message
string
да
-
Человекочитаемое описание. Может меняться, логику на нём не строить
details
object | absent
не всегда
-
Машинные подробности. Есть не у всех ошибок
limit
integer
да
-
Порог лимита. Только у rate_limited
retry_after
integer
да
-
Через сколько секунд повторить. Только у rate_limited
scope
string
да
read · write
Назначение лимита, в котором отказано. Только у rate_limited
missing_usd
string
да
-
Сколько не хватает на балансе. Строка. Только у insufficient_funds
refunded
boolean
да
true · false
Вернулись ли деньги на баланс. Приходит у отказов покупки, когда списание уже прошло
state
string
да
-
Состояние машины, из-за которого действие невозможно. У conflict и server_busy
available_actions
array<string>
да
-
Какие действия сейчас доступны. У conflict на управлении питанием
plan_id
integer
да
-
Конфигурация, к которой относится отказ
allowed
array<string>
да
-
Допустимые значения параметра. Например список кодов локаций
fields
array<object>
да
-
Список полей, не прошедших валидацию. Только у invalid_request
field
string
да
-
Путь до поля, например query.location или body.months
reason
string
да
-
Чем именно поле не подошло
request_id
string
да
-
Идентификатор вызова. Совпадает с заголовком X-Request-Id
Коды ошибок
code
HTTP
Описание
invalid_request
400
Запрос не прошёл валидацию - смотрите details.fields
unauthorized
401
Заголовка Authorization нет или он не в схеме Bearer
token_invalid
401
Ключ не найден или отозван
forbidden
403
Доступ к объекту запрещён
account_banned
403
Аккаунт заблокирован
insufficient_funds
402
Не хватает денег на балансе - смотрите details.missing_usd
not_found
404
Объекта нет или он принадлежит другому аккаунту
method_not_allowed
405
Метод не поддерживается этим путём
conflict
409
Действие невозможно в текущем состоянии - смотрите details.state
server_busy
409
Машина занята другой операцией (создаётся, ставится ОС)
rent_expired
409
Аренда истекла - управление недоступно, продлите сервер
server_no_ip
409
У сервера нет IP-адреса - управление недоступно до его возврата, напишите в поддержку. Продление работает
request_in_progress
409
Идентичный запрос ещё выполняется
idempotency_key_reused
422
Тем же Idempotency-Key прислали ДРУГОЙ запрос
rate_limited
429
Превышен лимит запросов - повторите через Retry-After секунд
internal_error
500
Ошибка на нашей стороне. Присылайте request_id в поддержку
service_unavailable
503
Сервис временно недоступен
Поле request_id совпадает с заголовком X-Request-Id. Присылайте его в поддержку - по нему находится конкретный вызов
Вопросы
Где взять ключ?
В панели: раздел API - кнопка «Выпустить ключ». То же самое можно сделать в Telegram-боте: Профиль - API-ключ
Я потерял ключ, как посмотреть его снова?
Никак: на сервере хранится только хеш ключа. Нажмите «Перевыпустить» - старый ключ сразу перестанет работать, новый покажется один раз
Можно ли через API купить или продлить сервер?
Да. Покупка - POST /servers, продление - POST /servers/{id}/renew. Оба списывают деньги с баланса, поэтому шлите с ними Idempotency-Key: без него повтор после таймаута купит второй сервер
Что будет, если превысить лимит?
Придёт 429 с кодом rate_limited и заголовком Retry-After. Подождите указанное число секунд и повторите
Как вы будете менять API?
Версия зашита в адрес (/v1). В рамках версии мы можем добавлять поля, но не переименовывать и не удалять существующие
Куда писать, если ответ выглядит неправильно?
На почту технической поддержки [email protected], приложив request_id из тела ответа - по нему мы найдём конкретный вызов. Форма заявок в панели вопросы по API не обрабатывает
Словарь
API
Интерфейс, по которому программа получает данные вместо человека
endpoint
Конкретный адрес метода, например /servers. Полный адрес = база + путь
token
Ключ доступа. Строка, которая доказывает, что запрос от вас
header
Служебная строка запроса. Ключ передаётся в заголовке Authorization
JSON
Текстовый формат данных. Его понимают все языки программирования
HTTP 200 / 4xx / 5xx
Код ответа: 200 - успех, 4xx - ошибка на стороне запроса, 5xx - на нашей стороне
rate limit
Ограничение частоты: сколько запросов в минуту можно сделать одним ключом