Перепродавайте серверы Astra VPS (🇳🇱 Нидерланды, 🇪🇪 Эстония, 🇵🇱 Польша, 🇩🇪 Германия) своим клиентам через простой REST API. Полное управление, мгновенная выдача, никаких вложений в железо.
Все запросы — с заголовком Authorization: Bearer <ваш API-ключ>. Ключ вы получаете в боте: t.me/astravpsbot?start=reseller.
Базовый URL: https://astravps.promo/api/reseller/v1
# проверка ключа — ваш баланс и текущая скидка curl -s https://astravps.promo/api/reseller/v1/balance \ -H "Authorization: Bearer rsl_ВАШКЛЮЧ"
{ "balance_rub": 1500.0, "discount_pct": 25.0,
"reseller": { "active_servers": 3, "current_pct": 25,
"next": { "at_servers": 20, "discount_pct": 37 } } }
Локации, тарифы (с вашими ценами со скидкой), список ОС и периодов.
curl -s https://astravps.promo/api/reseller/v1/catalog -H "Authorization: Bearer rsl_..."
{ "discount_pct": 25.0,
"locations": [ {"code":"nl","name":"Нидерланды","channel":"25 Гбит/с","available":true}, ... ],
"presets": [ {"idx":0,"cpu":1,"ram":1,"disk":10,
"price_month_rub":{"nl":158.0,"de":158.0,"ee":158.0,"pl":158.0}}, ... ],
"os": ["ubuntu2404","debian12", ...], "periods": ["1m","3m","6m","1y"] }
Windows Server 2019 (win2019) и Windows Server 2022 (win2022) доступны для заказа, в том числе в Нидерландах (nl). При первой установке образа на узле загрузка шаблона может занять дополнительное время. Выдача сервера асинхронная: дождитесь status=active в GET /api/reseller/v1/servers/{id}.
Список ОС по-прежнему доступен в GET /api/reseller/v1/catalog, поле os — массив строковых ключей. Дополнительно возвращается os_list с названиями и требованиями к ресурсам. Отдельный быстрый метод с теми же данными: GET /api/reseller/v1/os. Для обоих методов нужен ваш API-ключ.
curl -s https://astravps.co/api/reseller/v1/os \ -H "Authorization: Bearer rsl_..."
{
"os": ["ubuntu2404", "debian12", "win2019", "win2022"],
"os_list": [{
"key": "win2022",
"label": "Windows Server 2022",
"family": "windows",
"minimum_resources": {"cpu": 2, "ram": 4, "disk": 30}
}],
"os_endpoint": "/api/reseller/v1/os"
}
Пример сокращён: используйте полный актуальный ответ метода. В minimum_resources CPU указан в vCPU, RAM и диск — в ГБ. Значение null означает, что дополнительных ограничений со стороны ОС нет; границы тарифа и конструктора сохраняются. Цена с выбранной ОС и вашей скидкой рассчитывается через POST /api/reseller/v1/quote.
curl -s -X POST https://astravps.co/api/reseller/v1/quote \
-H "Authorization: Bearer rsl_..." -H "Content-Type: application/json" \
-d '{"cpu":2,"ram":4,"disk":30,"location":"nl","os":"win2022","period":"1m"}'
Для Windows требуется минимум 2 vCPU, 4 ГБ RAM и диск 30 ГБ. Неподходящая конфигурация возвращает 400 windows_requires_2cpu_4gb_30gb с полем minimum_resources. Эта проверка выполняется и перед переустановкой.
Подключение к Windows — по RDP, логин Administrator. Пароль возвращается в существующем поле API root_password; это название поля сохраняется для совместимости и не означает логин root в Windows. Полные данные доступа находятся в conn_info.
Неизвестный ключ ОС возвращает 400 invalid_os; известный, но снятый с установки образ — 400 os_unavailable. В обоих случаях ответ содержит available_os и os_endpoint. Поле alternative_os, если оно есть, предлагает другой образ; автоматической подмены версии ОС нет. Отказ на этапе проверки не списывает деньги и не переустанавливает сервер.
Баланс, текущая скидка и прогресс до следующего тира.
Создать сервер (списывает с баланса по вашей цене, создание асинхронное — статус смотрите в GET /servers).
| Поле | Тип | Описание |
|---|---|---|
idx | int, обяз. | Индекс тарифа из /catalog (0, 1, 2…) |
location | string, обяз. | nl · de · ee · pl |
os | string | Из catalog.os (по умолчанию ubuntu2404) |
period | string | 1m / 3m / 6m / 1y (по умолчанию 1m) |
password | string | root-пароль, мин. 8 символов (иначе сгенерируем) |
name | string | Название сервера (до 60 символов) |
curl -s -X POST https://astravps.promo/api/reseller/v1/servers \ -H "Authorization: Bearer rsl_..." -H "Content-Type: application/json" \ -d '{"idx":2,"location":"nl","os":"ubuntu2404","period":"1m","name":"client-01"}'
Ответ (HTTP 200). id выдаётся сразу; сервер создаётся в фоне 1–3 минуты — опрашивайте GET /servers/{id}, пока status не станет active (тогда заполнены ip и root_password). Если выдача не удалась, услуга с этим id исчезает из списка, деньги возвращаются на баланс.
{ "ok": true, "id": 2871, "status": "provisioning", "name": "client-01",
"location": "nl", "spec": {"cpu":2,"ram":4,"disk":60,"os":"ubuntu2404"},
"period": "1m", "expires_in_days": 30,
"charged_rub": 675.0, "balance_rub": 4325.0,
"hint": "poll GET /api/reseller/v1/servers/{id} until status=active (ip/root_password filled)" }
Ошибки: 400 (неверные idx/location, пароль короче 8), 402 {"error":"insufficient_balance","need_rub":…,"balance_rub":…}, 409 {"error":"no capacity in location"}.
Список ваших серверов (кроме удалённых). Ответ обёрнут в {"servers": [...]}; каждый элемент — объект сервера (см. ниже). id — целое число, характеристики лежат во вложенном spec.
{ "servers": [
{ "id": 2871, "name": "client-01", "status": "active",
"ip": "13.143.232.77", "root_password": "Xk9…",
"location": "nl",
"spec": {"cpu": 2, "ram": 4, "disk": 60, "os": "ubuntu2404"},
"price_month_rub": 675.0,
"created_at": "2026-09-22T18:40:12+00:00", "expires_at": "2026-10-22T18:40:12+00:00",
"conn_info": "IP: 13.143.232.77\nОС: …\nЛогин: root\nПароль: Xk9…" },
... ] }
status: provisioning (создаётся, ip/root_password ещё null) · active · suspended (не оплачен) · expired.
Детали одного сервера. Ответ обёрнут в {"server": {...}} — тот же объект, что в списке, плюс power_status (running / stopped, реальное состояние VM).
{ "server": { "id": 2871, "name": "client-01", "status": "active", "ip": "13.143.232.77",
"root_password": "Xk9…", "location": "nl",
"spec": {"cpu": 2, "ram": 4, "disk": 60, "os": "ubuntu2404"},
"price_month_rub": 675.0, "created_at": "…", "expires_at": "…",
"conn_info": "…", "power_status": "running" } }
Несуществующий или чужой id → 404 {"error":"not_found"}.
Управляющие действия. {action} — одно из:
| action | Что делает |
|---|---|
start · stop · reboot | Питание сервера |
reinstall | Переустановка ОС. Тело: {"os":"debian12"}. Данные стираются, новый пароль |
password | Сбросить root-пароль (данные стираются, IP сохраняется) |
upgrade | Увеличить CPU/RAM. Тело: {"cpu":2,"ram":4}. Спишется разница за остаток срока |
change-ip | Сменить IP на случайный из пула локации (тариф 100 ₽) |
rename | Переименовать сервер: тело {"name": "..."}, 2–60 символов, бесплатно |
renew | Продлить на 1 месяц (спишет месячную цену) |
vnc | Получить ссылку на веб-консоль VNC |
curl -s -X POST https://astravps.promo/api/reseller/v1/servers/123/reboot \
-H "Authorization: Bearer rsl_..."
POST /api/reseller/v1/servers/{id}/change-ip сохраняет заявку и списывает оплату один раз. Ответ 202 Accepted означает, что работа продолжается в фоне. Временный сбой не отменяет заявку: попытка повторится автоматически.
Для повторов одного запроса передавайте одинаковый заголовок Idempotency-Key (до 128 символов). Для новой, отдельно подтверждённой смены используйте новый ключ. Необязательное JSON-тело {"expected_ip":"192.0.2.10"} указывает адрес до начала операции и защищает от повторного запуска по устаревшей карточке.
{"ok":true,"id":123,"pending":true,"operation_id":"…",
"charged_rub":100,"status_url":"/api/reseller/v1/servers/123/change-ip/status?operation_id=…",
"operation":{"id":"…","status":"queued","completed":false,"refunded":false}}
Опрашивайте GET status_url с тем же API-ключом. Проверяйте operation.status: queued, running и retry означают продолжение; paused — сохранённую заявку, требующую сверки состояния услуги; completed — завершение, новый адрес находится в operation.new. У отменённой заявки статус cancelled, возврат подтверждает operation.refunded.
Повтор с тем же ключом после завершения возвращает 200 и прежний результат с old_ip/new_ip, без новой оплаты. Таймаут HTTP или потеря ответа не означают отмену либо возврат: сначала проверьте статус. Старые клиенты без ключа могут получить уже существующую заявку; ключ рекомендуется для однозначной обработки повторов.
Изменение IP в настройках вебхуков по-прежнему приходит событием server.ip_changed. Проверка статуса заявки доступна независимо от настройки вебхуков.
Удалить сервер. Остаток средств за неиспользованные дни возвращается на ваш баланс за вычетом 10% (комиссия за досрочную отмену). В ответе — фактически возвращённая сумма.
Настройте уведомления о смене основного и дополнительных IP, срока услуги и статуса, включая блокировку и разблокировку.
Используйте свой API-ключ. Укажите HTTPS-адрес обработчика (порт 443) и сохраните выданный ключ подписи. Доставка выключена до настройки.
API: GET / PUT / DELETE /api/reseller/v1/webhook. PUT: {"url":"https://example.com/astra"}. Журнал последних 100 событий: GET /api/reseller/v1/webhook/events.
События: server.ip_changed, server.extra_ips_changed, server.expiry_changed, server.status_changed. Тело: id, occurred_at (UTC), type, service_id, before, after. Пароли и ключи доступа к VPS не передаются. Статус отражает биллинг, а не каждое включение или выключение гипервизора.
Подпись: X-Astra-Signature: sha256=HMAC-SHA256(secret, timestamp + "." + raw_body), timestamp из X-Astra-Timestamp. Проверяйте свежесть времени и подпись, обрабатывайте повторный id идемпотентно. Отвечайте 2xx за 10 секунд; при сбое — до 12 попыток с увеличением интервала. Порядок доставки не гарантируется. Обновление настроек меняет ключ подписи и отменяет ожидающие события.