API для реселлеров

Перепродавайте серверы Astra VPS (🇳🇱 Нидерланды, 🇪🇪 Эстония, 🇵🇱 Польша, 🇩🇪 Германия) своим клиентам через простой REST API. Полное управление, мгновенная выдача, никаких вложений в железо.

−25%
на все серверы сразу, с первого заказа
−37%
когда у вас 20+ активных серверов (применяется автоматически)

Как это устроено

Авторизация

Все запросы — с заголовком 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 } } }

Эндпоинты

GET /catalog GET /balance POST /servers GET /servers GET /servers/{id} POST /servers/{id}/{action} DELETE /servers/{id}
GET/catalog

Локации, тарифы (с вашими ценами со скидкой), список ОС и периодов.

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

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/balance

Баланс, текущая скидка и прогресс до следующего тира.

POST/servers

Создать сервер (списывает с баланса по вашей цене, создание асинхронное — статус смотрите в GET /servers).

ПолеТипОписание
idxint, обяз.Индекс тарифа из /catalog (0, 1, 2…)
locationstring, обяз.nl · de · ee · pl
osstringИз catalog.os (по умолчанию ubuntu2404)
periodstring1m / 3m / 6m / 1y (по умолчанию 1m)
passwordstringroot-пароль, мин. 8 символов (иначе сгенерируем)
namestringНазвание сервера (до 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"}.

GET/servers

Список ваших серверов (кроме удалённых). Ответ обёрнут в {"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.

GET/servers/{id}

Детали одного сервера. Ответ обёрнут в {"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"}.

POST/servers/{id}/{action}

Управляющие действия. {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_..."

Смена IP: заявка и результат

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. Проверка статуса заявки доступна независимо от настройки вебхуков.

DELETE/servers/{id}

Удалить сервер. Остаток средств за неиспользованные дни возвращается на ваш баланс за вычетом 10% (комиссия за досрочную отмену). В ответе — фактически возвращённая сумма.

Важное

Скидка реселлера действует только через это API. Покупки через обычного бота или сайт идут по полной цене — не путайте личный кабинет и реселлерский API.
Скидка растёт автоматически: как только у вас станет 20 активных серверов, все новые заказы пойдут по −37%. Ничего запрашивать не нужно.

Вебхуки: изменения ваших серверов

Настройте уведомления о смене основного и дополнительных 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 попыток с увеличением интервала. Порядок доставки не гарантируется. Обновление настроек меняет ключ подписи и отменяет ожидающие события.

Вопросы, увеличение лимитов, индивидуальные условия — поддержка @astravps.
© 2026 Astra VPS · На главную