API

Покупка звёзд Telegram, Premium, Steam и игровых пакетов из вашего кода — сайта, бота или приложения.

Базовый адрес: https://vipstars.duckdns.org/api/v1
Все запросы — по HTTPS. Ответ всегда JSON с полем success.

Как начать

  1. Напишите владельцу боту /api и создайте ключ.
  2. Скопируйте ключ — он показывается один раз.
  3. Пополните баланс — с него списываются покупки.
  4. Передавайте ключ в каждом запросе: Authorization: Bearer ВАШ_КЛЮЧ
Ключ — это доступ к вашим деньгам. Держите его в переменной окружения, не кладите в git и не показывайте в браузере: запрос из JavaScript на странице отдаёт ключ каждому посетителю. Вызывайте API со своего сервера.

Точки

МетодПутьЧто делает Параметры
GET/productsСписок товаровНеобязательный ?type=stars|premium|steam|game
GET/products/{id}Один товарid — из списка товаров
GET/balanceОстаток на балансе
GET/userАккаунт, ключ, лимиты, вебхук
GET/ordersСписок заказов?limit=20&offset=0
GET/orders/{order_id}Один заказorder_id — ORD-000123
POST/order/createСоздать заказproduct_id, quantity, customer
GET/order/statusСтатус заказа?order_id=ORD-000123

Создать заказ

curl -X POST https://vipstars.duckdns.org/api/v1/order/create \\
  -H "Authorization: Bearer ВАШ_КЛЮЧ" \\
  -H "Content-Type: application/json" \\
  -H "Idempotency-Key: my-order-1001" \\
  -d '{"product_id":"stars","quantity":100,"customer":"@durov"}'

Ответ

{
  "success": true,
  "order_id": "ORD-000123",
  "status": "processing",
  "product_id": "stars",
  "quantity": 100,
  "amount": 1931,
  "amount_text": "19.31",
  "currency": "TJS",
  "customer": "@durov",
  "transaction_id": "TX-9F2A71B4C8D0",
  "created_at": "2026-09-15T10:04:11+00:00"
}
Деньги — целые числа в дирамах (1 сомони = 100 дирам). amount: 1931 — это 19.31 сомони. Так сделано нарочно: дробные числа при сложении дают копеечные расхождения в любом языке.

Повторный запрос

Передайте Idempotency-Key (заголовком или полем idempotency_key). Если тот же запрос уйдёт дважды — из-за обрыва связи или повтора очереди, — второй раз деньги не спишутся: вернётся тот же заказ.

Статус заказа

curl "https://vipstars.duckdns.org/api/v1/order/status?order_id=ORD-000123" \
  -H "Authorization: Bearer ВАШ_КЛЮЧ"
{
  "success": true,
  "order_id": "ORD-000123",
  "status": "completed",
  "result": "@durov",
  "amount": 1931,
  "amount_text": "19.31",
  "currency": "TJS"
}
СтатусЧто значит
pendingЗаказ принят, ещё не в работе.
processingОтправлен поставщику, идёт выдача.
completedВыполнен.
failedНе выполнен, деньги не списаны или возвращены.
cancelledОтменён.
refundedДеньги вернулись на баланс.

Вебхук

Укажите свой адрес в боте (/api → Вебхук) — и мы сами сообщим, когда статус заказа изменится. Опрашивать /order/status в цикле тогда не нужно.

POST ваш-адрес
X-Signature: 3b099d0edd…
X-Signature-Algorithm: hmac-sha256

{
  "event": "order.completed",
  "order_id": "ORD-000123",
  "status": "completed",
  "product_id": "stars",
  "quantity": 100,
  "amount": 1931,
  "customer": "@durov",
  "result": "@durov"
}

Проверьте подпись

Подпись — HMAC-SHA256 от сырого тела запроса на вашем секрете whsec_…. Без проверки любой, кто узнает ваш адрес, сможет прислать «заказ выполнен».

# Python — проверка подписи вебхука
import hmac, hashlib

def genuine(body: bytes, header: str, secret: str) -> bool:
    mine = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(mine, header)   # сравнение постоянное по времени
Отвечайте 200, как только приняли событие. Если ответа нет, мы повторим — до 8 раз. Адрес должен быть https:// и вести наружу: внутренние адреса (127.0.0.1, 10.x) мы не вызываем.

Ошибки

{
  "success": false,
  "error": {
    "code": "insufficient_funds",
    "message": "Недостаточно средств.",
    "required": 1931,
    "balance": 400,
    "currency": "TJS"
  }
}
Кодerror.codeЧто значит
400bad_json, bad_quantity, missing_customerЗапрос не разобрать.
401invalid_keyКлюч не принят.
402insufficient_fundsНе хватает денег на балансе.
403key_disabled, account_blockedКлюч выключен или доступ закрыт.
404product_not_found, order_not_foundНет такого товара или заказа.
409in_progressТот же idempotency_key ещё выполняется.
429rate_limited, too_many_attemptsСлишком часто. В заголовке Retry-After — через сколько секунд повторить.
503api_disabledAPI временно выключен владельцем.

Лимиты