Быстрый старт
Базовый адрес: https://cloud-api.adaptgroup.pro. Создайте интеграцию Cloud API в дашборде, скопируйте её числовой ID и секретный ключ. Перед покупкой пополните баланс интеграции. ID и цены в примерах условные; актуальные значения получайте из каталога.
Авторизация и формат запроса
Каждый запрос требует X-Api-Key и api_key_id. Используйте метод и расположение параметров, указанные на странице маршрута:
- GET и DELETE: идентификаторы и фильтры в пути/query, без JSON-тела.
- POST/PATCH/PUT с описанным телом:
Content-Type: application/jsonиapi_key_idв JSON. - POST ссылки консоли и PUT назначения сохранённого IPv4:
api_key_idв query, без JSON-тела. - Покупки, продления и команды VPS требуют
Idempotency-Keyтам, где он указан. Расчёты и настройка автопродления — нет.
Храните ключ на своём бекенде. api_user_id — строковый ID вашего клиента, а не ID интеграции. Доступны только ресурсы авторизованной интеграции.
curl 'https://cloud-api.adaptgroup.pro/balance?api_key_id=1' \
--header 'X-Api-Key: YOUR_API_KEY'
{
"success": true,
"api_key_id": 1,
"balance": "100.0000",
"currency": "USD",
"balance_updated_at": "2026-09-28T12:00:00"
}
Суммы — десятичные строки в USD; используйте десятичную арифметику. Время — UTC; некоторые даты из БД могут приходить без суффикса часового пояса. Целочисленные поля передавайте JSON-числами, логические — true/false. Неизвестные поля JSON отклоняются. Формы ответов различаются: баланс, тарифы VPS и ОС используют поля верхнего уровня, большинство ресурсов — data. Списки с пагинацией содержат total_count.
Выберите VPS и рассчитайте цену
- Тарифы VPS: выберите
location_id,platformиplan_code. Цены уже включают наценку интеграции.available=nullозначает отсутствие данных о доступности; просмотр каталога не резервирует ресурсы. - Операционные системы: выберите
os_id. - Расчёт покупки. Он не списывает деньги, не резервирует VPS и не требует достаточного баланса.
curl --request POST 'https://cloud-api.adaptgroup.pro/vms/quote' \
--header 'X-Api-Key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"api_key_id": 1,
"api_user_id": "customer-123",
"location_id": 1,
"platform": "ryzen",
"plan_code": "C1",
"os_id": 1,
"password": "Example-Password-2026!",
"cpu_percent": 60,
"months": 1,
"auto_renew": false
}'
{
"success": true,
"data": {
"amount_usd": "5.0000",
"balance_usd": "100.0000",
"currency": "USD",
"months": 1,
"discount_percent": "0"
}
}
Создание и расчёт требуют ровно одно из password или ssh_public_key. Передавайте сам публичный ключ OpenSSH, а не ssh_key_id. Доля CPU по умолчанию 60; доступны 20/40/60/80/100. Сроки: 1/3/6/12/24/36 календарных месяцев. auto_renew по умолчанию false.
Подтвердите покупку и получите результат
Отправьте то же тело в POST /vms, при необходимости добавив expected_amount_usd из расчёта, и укажите уникальный Idempotency-Key:
curl --request POST 'https://cloud-api.adaptgroup.pro/vms' \
--header 'X-Api-Key: YOUR_API_KEY' \
--header 'Idempotency-Key: customer-123-vps-20260928-001' \
--header 'Content-Type: application/json' \
--data '{
"api_key_id": 1,
"api_user_id": "customer-123",
"location_id": 1,
"platform": "ryzen",
"plan_code": "C1",
"os_id": 1,
"password": "Example-Password-2026!",
"expected_amount_usd": "5.0000"
}'
Замените примерную цену результатом своего расчёта. HTTP 202 означает приём запроса, а не готовность VPS:
{
"success": true,
"data": {
"order_id": 401,
"status": "pending",
"amount_usd": "5.0000",
"currency": "USD",
"vm_id": null,
"rental_id": null,
"error_code": null,
"error_message": null
}
}
Сохраните order_id. Узнавайте результат через Детали заказа или Вебхуки. После завершения используйте vm_id для Деталей VPS. Команды питания/firewall/переустановки возвращают операцию в data; её id — это operation_id, а не ID заказа.
Повторы и подтверждение цены
На каждое отдельное действие создавайте свой Idempotency-Key: 1–200 печатных ASCII-символов без пробелов. После таймаута или неопределённого ответа повторяйте тот же метод, путь, параметры и ключ. Новый ключ может создать вторую оплаченную покупку. Повторное использование ключа с другими параметрами вызывает конфликт.
expected_amount_usd необязателен. Без него списывается текущая рассчитанная цена. С ним несовпадение возвращает 409 price_changed до списания; при смене тарифа значение является максимумом, поскольку доплата за остаток срока может уменьшаться. После подтверждённого отказа из-за цены получите новый расчёт и отправьте заново согласованное действие с новым ключом. Для трафика можно также зафиксировать expected_period_id из расчёта.
Ошибки
| HTTP | Значение |
|---|---|
200 | Получен результат; проверьте его поля |
202 | Запрос принят в обработку; проверяйте статус заказа/операции |
401 | Нет ключа, неверный ключ/ID или интеграция выключена |
404 | Ресурс не найден в интеграции |
409 | Конфликт: недостаточно средств, изменилась цена, повторно использован ключ, ресурс занят или устарела ревизия firewall |
422 | Некорректные или неподдерживаемые параметры |
500 | Непредвиденная ошибка сервера |
503 | Сервис недоступен или результат операции не подтверждён |
detail может быть строкой, объектом или массивом ошибок валидации. Не используйте текст сообщения как стабильный код. Язык документации не меняет сообщения API.
{
"detail": {
"code": "insufficient_balance",
"message": "Недостаточно средств"
}
}
{
"detail": [
{
"type": "greater_than_equal",
"loc": ["body", "api_key_id"],
"msg": "Input should be greater than or equal to 1",
"input": 0,
"ctx": {"ge": 1}
}
]
}
При operation_unconfirmed, таймауте или сетевой ошибке сохраняйте исходный ключ и проверяйте результат. Неуспешный HTTP-ответ сам по себе не доказывает, что действие не произошло.