REST API QoCloud
Через API доступны те же операции, что и в личном кабинете: создание сервера, перезагрузка, переустановка ОС, продление. JSON поверх HTTPS, ключи с правами «чтение» или «управление», события — через вебхуки.
https://qocloud.tech/api/v1Ключ из раздела «Настройки → API-ключи» в заголовке Authorization: Bearer …. Храните ключ так же, как пароль.
Первый запрос
Сохраните токен в переменную окружения и запросите список серверов.
$ export QOCLOUD_TOKEN="qc_live_…"$ curl https://qocloud.tech/api/v1/servers -H "Authorization: Bearer $QOCLOUD_TOKEN"/catalogКонфигурации и цены
Страны, конфигурации с ценами в рублях за месяц, доступные ОС, сроки оплаты и скидки за срок (в процентах). Ключ не нужен.
$ curl -X GET https://qocloud.tech/api/v1/catalog \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "locations": [ { "code": "nl", "name": "Нидерланды", "available": true } ], "plans": [ { "id": "2c-4g-60", "line": "start", "cpu": 2, "ram_gb": 4, "disk_gb": 60, "monthly": { "nl": 945 } } ], "os": [ "ubuntu2404", "debian12" ], "periods": [ "1m", "3m", "6m", "1y" ], "discounts": { "1m": 0, "3m": 15, "6m": 20, "1y": 25 }}/balanceБаланс
Баланс, расходы в месяц по работающим серверам и состояние автопродления. Права: чтение.
$ curl -X GET https://qocloud.tech/api/v1/balance \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "balance": 4820, "currency": "RUB", "monthly_spend": 6241, "auto_renew": true}/serversСписок серверов
Все серверы аккаунта. status: provisioning, active, suspended, expired, failed; power: running или stopped. Права: чтение.
$ curl -X GET https://qocloud.tech/api/v1/servers \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "servers": [ { "id": "6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70", "name": "web-01", "status": "active", "power": "running", "plan": "2c-4g-60", "cpu": 2, "ram_gb": 4, "disk_gb": 60, "location": "nl", "os": "ubuntu2404", "ip": "203.0.113.10", "price_month": 945, "paid_until": "2026-12-02T09:00:00.000Z", "created_at": "2026-06-02T09:00:00.000Z", "last_error": null } ]}/serversСоздать сервер
Списывает стоимость срока с баланса (со скидкой за 3, 6 или 12 месяцев) и создаёт сервер (1–3 минуты). Передайте заголовок Idempotency-Key — повтор запроса с тем же ключом в течение суток не создаст второй сервер. Если средств на балансе недостаточно, API вернёт 402 с полем need. Права: управление.
| Параметр | Описание |
|---|---|
planstring · обязательный | id конфигурации из /catalog |
locationstring · обязательный | код страны: nl, de, pl, ee, cz, ch, se |
osstring · обязательный | образ из /catalog |
periodstring · обязательный | 1m, 3m, 6m или 1y |
namestring · обязательный | латиница, цифры и дефис, 2–60 символов |
$ curl -X POST https://qocloud.tech/api/v1/servers \ -H "Authorization: Bearer $QOCLOUD_TOKEN" \ -H "Content-Type: application/json" \ -d '{"plan":"2c-4g-60","location":"nl","os":"ubuntu2404","period":"1m","name":"web-02"}'{ "server": { "id": "6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70", "name": "web-02", "status": "provisioning", "power": null, "plan": "2c-4g-60", "cpu": 2, "ram_gb": 4, "disk_gb": 60, "location": "nl", "os": "ubuntu2404", "ip": null, "price_month": 945, "paid_until": "2026-12-02T09:00:00.000Z", "created_at": "2026-06-02T09:00:00.000Z", "last_error": null }}/servers/{id}Сервер
Актуальные данные о сервере (статус сверяется с дата-центром). Права: чтение.
| Параметр | Описание |
|---|---|
idstring · обязательный | id сервера |
$ curl -X GET https://qocloud.tech/api/v1/servers/6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70 \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "server": { "id": "6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70", "name": "web-01", "status": "active", "power": "running", "plan": "2c-4g-60", "cpu": 2, "ram_gb": 4, "disk_gb": 60, "location": "nl", "os": "ubuntu2404", "ip": "203.0.113.10", "price_month": 945, "paid_until": "2026-12-02T09:00:00.000Z", "created_at": "2026-06-02T09:00:00.000Z", "last_error": null }}/servers/{id}/passwordRoot-пароль
Текущий root-пароль. Каждый запрос записывается в журнал безопасности. Права: управление.
$ curl -X GET https://qocloud.tech/api/v1/servers/6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70/password \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "id": "6f1c2a9e-…", "root_password": "k3P…"}/servers/{id}/eventsЖурнал сервера
Кто и когда управлял сервером: панель (user), API-ключ (api, имя ключа — в api_key), поддержка (admin) или автоматика (system). Сумма: минус — списание, плюс — возврат. Новые записи сверху. Права: чтение.
| Параметр | Описание |
|---|---|
idstring · обязательный | id сервера |
limitnumber | сколько записей вернуть, 1–200 (по умолчанию 100) |
$ curl -X GET https://qocloud.tech/api/v1/servers/6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70/events \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "events": [ { "id": "0b7e…", "at": "2026-06-02T09:05:00.000Z", "action": "change_ip", "label": "Смена IP", "actor": "api", "api_key": "deploy", "ok": true, "detail": "Прежний 203.0.113.10", "amount": -150 } ]}/servers/{id}/actions/{action}Действие с сервером
start, stop, reboot, reinstall (нужен os), reset-password, change-ip (платно), renew (продление на месяц с баланса), upgrade (нужен plan, доплата за остаток срока). Операции асинхронные — ответ 202, статус меняется за секунды–минуты. Права: управление.
| Параметр | Описание |
|---|---|
actionstring · обязательный | start, stop, reboot, reinstall, reset-password, change-ip, renew, upgrade |
osstring | только для reinstall |
planstring | только для upgrade |
$ curl -X POST https://qocloud.tech/api/v1/servers/6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70/actions/reinstall \ -H "Authorization: Bearer $QOCLOUD_TOKEN" \ -H "Content-Type: application/json" \ -d '{"os":"debian12"}'{ "ok": true, "action": "reinstall", "message": "Переустановка началась", "server": { "id": "6f1c2a9e-…", "status": "active", "power": "running" }}/servers/{id}Изменить сервер
Имя, заметка, теги и автопродление. Передайте только поля, которые меняете; auto_renew: null — как в настройке аккаунта. Права: управление.
| Параметр | Описание |
|---|---|
namestring | латиница, цифры и дефис, 2–60 символов |
notestring | null | заметка до 1000 символов; null — удалить |
tagsstring[] | теги целиком (заменяют прежние) |
auto_renewboolean | null | автопродление этого сервера |
$ curl -X PATCH https://qocloud.tech/api/v1/servers/6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70 \ -H "Authorization: Bearer $QOCLOUD_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"web-02","tags":["prod","eu"],"auto_renew":true}'{ "server": { "id": "6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70", "name": "web-02", "status": "active", "power": "running", "plan": "2c-4g-60", "cpu": 2, "ram_gb": 4, "disk_gb": 60, "location": "nl", "os": "ubuntu2404", "ip": "203.0.113.10", "price_month": 945, "paid_until": "2026-12-02T09:00:00.000Z", "created_at": "2026-06-02T09:00:00.000Z", "last_error": null, "note": null, "tags": [ "eu", "prod" ], "auto_renew": true }}/ssh-keysSSH-ключи
Публичные ключи аккаунта с отпечатками SHA256 — те же, что в «Настройках». Права: чтение.
$ curl -X GET https://qocloud.tech/api/v1/ssh-keys \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "ssh_keys": [ { "id": "3a1b…", "name": "laptop", "type": "ssh-ed25519", "fingerprint": "SHA256:4f2A…", "public_key": "ssh-ed25519 AAAAC3Nza… laptop", "created_at": "2026-06-02T09:00:00.000Z" } ]}/ssh-keysДобавить SSH-ключ
Принимает ed25519, ECDSA и RSA от 2048 бит. Тот же ключ второй раз — 409. Не больше 20 ключей. Ответ — 201. Права: управление.
| Параметр | Описание |
|---|---|
public_keystring · обязательный | строка из ~/.ssh/id_ed25519.pub |
namestring | подпись; по умолчанию — комментарий ключа |
$ curl -X POST https://qocloud.tech/api/v1/ssh-keys \ -H "Authorization: Bearer $QOCLOUD_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"laptop","public_key":"ssh-ed25519 AAAAC3Nza… laptop"}'{ "ssh_key": { "id": "3a1b…", "name": "laptop", "type": "ssh-ed25519", "fingerprint": "SHA256:4f2A…", "public_key": "ssh-ed25519 AAAAC3Nza… laptop", "created_at": "2026-06-02T09:00:00.000Z" }}/ssh-keys/{id}Удалить SSH-ключ
Удаляет ключ из аккаунта. На уже созданных серверах он остаётся в authorized_keys — уберите его там сами. Права: управление.
$ curl -X DELETE https://qocloud.tech/api/v1/ssh-keys/6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70 \ -H "Authorization: Bearer $QOCLOUD_TOKEN"{ "id": "3a1b…", "deleted": true}/servers/{id}Удалить сервер
Удаляет сервер и все данные — необратимо. Нужен заголовок X-Confirm-Name с именем сервера. Оплаченный срок не возвращается (см. политику возврата). Права: управление.
$ curl -X DELETE https://qocloud.tech/api/v1/servers/6f1c2a9e-8b1d-4c1e-9f7a-2d3b4c5e6f70 \ -H "Authorization: Bearer $QOCLOUD_TOKEN" \ -H "X-Confirm-Name: web-01"{ "id": "6f1c2a9e-…", "status": "deleted"}События на ваш сервер
Адрес и события задаются в «Настройки → API → Вебхуки». Мы отправляем POST с JSON и ждём ответ 2xx за 10 секунд; при ошибке повторяем через 1, 5, 30 минут, 2, 6 и 12 часов. По редиректам не переходим.
server.readyсервер создан и готов, в data.server — id, имя, IPserver.expiringсрок заканчивается: за 7 и 3 дня, за 3 часа и после окончания (stage)server.renewedсервер продлён, в data.amount — списанная суммаbalance.lowбаланса не хватит на ближайшие продления или он ниже порогаalert.firingсработало оповещение мониторинга или проверки доступностиalert.resolvedоповещение снятоpayment.succeededплатёж зачислен на баланс
Проверка подписи
Заголовок X-QoCloud-Signature: t=<время>,v1=<HMAC-SHA256 от «t.тело» на секрете адреса>. Сверяйте подпись и отклоняйте запросы старше 5 минут.
import crypto from 'node:crypto';function verify(body, header, secret) { const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('='))); if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; const expected = crypto.createHmac('sha256', secret).update(`${t}.${body}`).digest('hex'); return crypto.timingSafeEqual(Buffer.from(v1, 'hex'), Buffer.from(expected, 'hex'));}Коды ошибок
Ответ с ошибкой: { "error": { "code", "message" } }. Коды не меняются, по ним можно строить логику скриптов.
- 401
unauthorizedНет ключа, ключ отозван или истёк. - 403
forbiddenКлюч только для чтения или аккаунт заблокирован. - 400
bad_requestНеверные поля; подробности — в fields. - 402
insufficient_balanceНедостаточно средств на балансе; недостающая сумма — в need. - 404
not_foundСервер не найден (или он чужой). - 409
conflictДействие сейчас недоступно: например, сервер ещё создаётся или остановлен. - 429
rate_limited120 запросов в минуту на ключ; тяжёлые операции — 10 за 10 минут.