Покупка звёзд Telegram, Premium, Steam и игровых пакетов из вашего кода — сайта, бота или приложения.
https://vipstars.duckdns.org/api/v1success./api и создайте ключ.Authorization: Bearer ВАШ_КЛЮЧ| Метод | Путь | Что делает | Параметры |
|---|---|---|---|
| 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"}'<?php
$ch = curl_init('https://vipstars.duckdns.org/api/v1/order/create');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SHOP_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: my-order-1001',
],
CURLOPT_POSTFIELDS => json_encode([
'product_id' => 'stars',
'quantity' => 100,
'customer' => '@durov',
]),
]);
$answer = json_decode(curl_exec($ch), true);
curl_close($ch);
if (empty($answer['success'])) {
throw new RuntimeException($answer['error']['message'] ?? 'unknown');
}
echo $answer['order_id']; // ORD-000123import os, requests
answer = requests.post(
"https://vipstars.duckdns.org/api/v1/order/create",
headers={
"Authorization": f"Bearer {os.environ['SHOP_API_KEY']}",
"Idempotency-Key": "my-order-1001",
},
json={"product_id": "stars", "quantity": 100, "customer": "@durov"},
timeout=30,
).json()
if not answer["success"]:
raise RuntimeError(answer["error"]["message"])
print(answer["order_id"]) # ORD-000123const answer = await fetch("https://vipstars.duckdns.org/api/v1/order/create", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SHOP_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "my-order-1001",
},
body: JSON.stringify({
product_id: "stars",
quantity: 100,
customer: "@durov",
}),
}).then((r) => r.json());
if (!answer.success) throw new Error(answer.error.message);
console.log(answer.order_id); // ORD-000123{
"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"
}
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 | Что значит |
|---|---|---|
| 400 | bad_json, bad_quantity, missing_customer | Запрос не разобрать. |
| 401 | invalid_key | Ключ не принят. |
| 402 | insufficient_funds | Не хватает денег на балансе. |
| 403 | key_disabled, account_blocked | Ключ выключен или доступ закрыт. |
| 404 | product_not_found, order_not_found | Нет такого товара или заказа. |
| 409 | in_progress | Тот же idempotency_key ещё выполняется. |
| 429 | rate_limited, too_many_attempts | Слишком часто. В заголовке Retry-After — через сколько секунд повторить. |
| 503 | api_disabled | API временно выключен владельцем. |
429
и заголовок Retry-After.X-Request-Id. Если что-то не
работает — пришлите этот номер владельцу, по нему запрос найдётся
в журнале.