Перейти к основному содержанию
Публичный REST API Lumi для автоматизации: данные аккаунта, проверка и покупка ресурсов, пополнение баланса. У каждого продукта — свой API и свой ключ.
ПродуктБазовый URLДокументация
Доменыhttps://scamprojecttest.xyz/api/v1Домены
Хостинг (VPS)https://panel.scamprojecttest.xyz/hosting/api/v1Хостинг
Проксиhttps://panel.scamprojecttest.xyz/proxy/api/v1Прокси
Ключ одного продукта работает только с этим продуктом. Для доменов, хостинга и прокси выпускаются разные ключи. Ключ выдаёт оператор — напиши в @lumisup_robot.

Авторизация

Каждый запрос передаёт ключ в заголовке:
Authorization: Bearer lumi_domains_XXXXXXXXXXXXXXXXXXXX
Ключ показывается один раз — храни его в секрете. В базе лежит только хеш, восстановить ключ нельзя — только выпустить новый.

Типы ключей

ТипДоступПривязка
resellerТолько данные одного пользователяЖёстко привязан к одному аккаунту
operatorВсе пользователиНе привязан; полный доступ
  • Reseller: все запросы автоматически ограничены его аккаунтом. Чужой user_id вернёт 404 (существование чужих аккаунтов не раскрывается).
  • Operator: указывает user_id явно (в теле или ?user_id=); для денежных операций это обязательно.

Права (scopes)

Reseller-ключу выдаётся набор прав. Operator-ключ имеет все права неявно.
ScopeЧто разрешает
domains:read / vps:read / proxy:readЧтение: списки, статусы, цены, каталог
domains:write / vps:write / proxy:writeУправление своими объектами
domains:buy / vps:buy / proxy:buyПокупка и продление (списывает баланс)
deposits:writeСоздание счетов на пополнение
admin:*Только operator-ключ; кросс-пользовательские операции
Недостающее право → 403 forbidden_scope.

Денежные операции

Эндпоинты, которые двигают деньги (создание счёта, покупка, продление), подчиняются дополнительным правилам.
Денежные операции работают, только когда на деплое включён флаг API_MONEY_ENABLED. Пока он выключен — такие запросы возвращают 403 money_disabled, даже если у ключа есть нужный scope.

Идемпотентность

Каждый денежный POST обязан нести заголовок Idempotency-Key (8–200 символов):
Idempotency-Key: a1b2c3d4-orders-2026-06-09
  • Повтор запроса с тем же ключом вернёт исходный ответ, не выполняя операцию заново.
  • Два одновременных одинаковых запроса не выполнятся дважды: проигравший получит 409 in_progress.
  • Без заголовка → 400 idempotency_key_required.

Дневной лимит трат

У ключа может быть дневной лимит в USD (или общий по умолчанию). По его достижении денежные операции возвращают 402 daily_cap_exceeded до начала следующих суток (UTC). Operator-ключи лимиту не подчиняются.

Подпись запросов (опционально)

Если ключ выпущен с требованием подписи, каждый денежный запрос должен нести заголовок:
X-Signature: HMAC-SHA256(signing_secret, raw_request_body)
Подпись считается по точным байтам тела запроса. Так утечка одного Bearer-ключа не даёт двигать деньги без второго секрета. Без корректной подписи → 401 invalid_signature.
import hmac, hashlib, requests

KEY = "lumi_domains_XXX"
SIGNING = "your_signing_secret"  # выдаётся вместе с ключом, если включена подпись
body = b'{"amount_usd":"5","provider":"cryptobot"}'
sig = hmac.new(SIGNING.encode(), body, hashlib.sha256).hexdigest()

requests.post(
    "https://scamprojecttest.xyz/api/v1/deposits",
    headers={
        "Authorization": f"Bearer {KEY}",
        "Idempotency-Key": "dep-2026-06-09-001",
        "X-Signature": sig,
        "Content-Type": "application/json",
    },
    data=body,
)

Лимиты запросов

КлассЛимит по умолчанию
Обычные запросы120 запросов / 60 с на ключ
Денежные запросы20 запросов / 60 с на ключ
Bulk-запрос расходует столько денежных «токенов», сколько в нём позиций. При превышении → 429 rate_limited с заголовком Retry-After (секунды).

Пагинация

Списочные эндпоинты используют курсор:
GET /v1/domains?limit=50&cursor=eyJ...
  • limit: 1–200 (по умолчанию 50).
  • Ответ: { "items": [...], "next_cursor": "...", "has_more": true }. Передай next_cursor в cursor для следующей страницы. next_cursor: null — страниц больше нет.

Массовые операции (bulk)

Bulk-эндпоинты принимают массив и возвращают по-позиционный результат — операции не атомарны: ошибка одной позиции не откатывает остальные.
{
  "total": 2,
  "ok": 1,
  "failed": 1,
  "items": [
    { "ref": "a.com", "status": "ok", "result": { "...": "..." } },
    { "ref": "b.com", "status": "failed", "error": { "code": "...", "message": "..." } }
  ]
}
Лимит позиций в одном запросе — 500, иначе 413 batch_too_large. Долгие bulk-покупки выполняются асинхронно: эндпоинт возвращает 202 с batch_id, статус опрашивается через GET /v1/batches/{batch_id}.

Формат ошибок

Все ошибки — единый JSON:
{ "error": { "code": "forbidden_scope", "message": "Key lacks the required scope 'domains:buy'." } }
HTTPcodeКогда
401missing_bearerНет заголовка Authorization
401invalid_keyКлюч неизвестен, отозван или истёк
401invalid_signatureТребуется подпись, а её нет/неверна
402daily_cap_exceededДостигнут дневной лимит трат
403forbidden_scopeУ ключа нет нужного права
403money_disabledДенежные операции выключены на деплое
404not_foundОбъект не найден (или чужой — у reseller)
409in_progressИдентичный запрос ещё выполняется
413batch_too_largeСлишком много позиций в bulk
422validation_errorНекорректное тело/параметры
429rate_limitedПревышен лимит запросов
503api_disabledAPI выключен на деплое

Деньги в ответах

Денежные суммы всегда приходят строками ("5.15"), а не числами с плавающей точкой — без потерь точности. Передавай суммы в запросах тоже строками.

Здоровье сервиса

GET /healthz   →  { "status": "ok", "service": "api" }
Без авторизации; только проверка живости.