Donatix API
Telegram Stars и Premium, пополнения игр, Steam и подарочные карты — одним API.
Базовый URL
https://donatix.tj/api/v1Ключ
X-API-Key: dx_live_…
Создаётся в панели → API. Можно и
Authorization: Bearer …Быстрый старт
1Баланс
curl -s https://donatix.tj/api/v1/balance -H "X-API-Key: $KEY"
{"ok": true, "balance": "100.0000", "currency": "USD"}
2Товар
curl -s "https://donatix.tj/api/v1/products?kind=telegram_stars" -H "X-API-Key: $KEY"
{"ok": true, "items": [{
"product_id": "tg-stars", "kind": "telegram_stars", "name": "Telegram Stars",
"unit": "star", "price_usd": "0.016605", "min_quantity": 50, "max_quantity": 10000,
"fields": [{"key": "telegram_username", "label": "Telegram @username", "type": "text"}]
}]}
3Заказ
Передавайте свой уникальный Idempotency-Key — повтор запроса не спишет деньги второй раз.
curl -s -X POST https://donatix.tj/api/v1/orders \
-H "X-API-Key: $KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"product_id": "tg-stars", "quantity": 100, "fields": {"telegram_username": "@player"}}'
{"ok": true, "order": {
"order_id": "dx-1042", "status": "processing", "kind": "telegram_stars",
"product_name": "Telegram Stars 100", "quantity": 100,
"total_usd": "1.6605", "delivery": null, "error": null
}}
4Результат
GET /orders/dx-1042 или webhook.
processingВ работе — спрашивайте раз в 5–10 с
completedВыполнен, коды — в
deliveryfailedНе выполнен, деньги уже на балансе
Методы
GET
/meПрофиль, баланс, уровеньGET
/balanceБаланс в USDGET
/transactions?page=1&limit=20Движение денегGET
/categoriesИгры, сервисы, бренды картGET
/products?kind=&category_id=&q=Товары с вашей ценой и региономGET
/products/{product_id}Один товар; account_check — можно ли проверить аккаунтPOST
/accounts/checkПроверить ID игрока, получить никPOST
/ordersСоздать заказGET
/orders?page=&limit=&status=Ваши заказыGET
/orders/{order_id}Заказ со статусом и выдачейGET
/steam-gifts/games?q=Поиск игр для Steam-гифтовGET
/steam-gifts/games/{appid}Издания и цены по регионамkind: telegram_stars telegram_premium steam_topup steam_gift topup gift_card game_key
Поля заказа
Что передать в fields, указано в самом товаре.
| Товар | fields |
|---|---|
| Telegram Stars, Premium | telegram_username |
| Пополнения игр | player_id, иногда сервер или зона |
| Подарочные карты, ключи игр | нет, только quantity |
| Пополнение Steam | steam_login currency amount |
| Steam-гифт | app_id sub_id region invite_url |
Проверка аккаунта
Для многих игр можно проверить ID до заказа и показать покупателю ник. Заказ на несуществующий аккаунт не создаётся, деньги не списываются.
curl -s -X POST https://donatix.tj/api/v1/accounts/check \
-H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"product_id": "topup-a1b2c3d4e5", "fields": {"player_id": "5123456789"}}'
{"ok": true, "supported": true, "valid": true, "player_name": "Player_6789", "region": "GLOBAL"}
Ошибки
{"ok": false, "error": "Недостаточно средств: нужно $1.6605, на балансе $0.5000.", "code": "insufficient_balance"}
| HTTP | code |
|---|---|
| 400 | missing_field invalid_field invalid_quantity account_not_found |
| 401 | unauthorized |
| 402 | insufficient_balance |
| 403 | account_inactive account_blocked |
| 404 | product_not_found not_found |
| 409 | idempotency_key_reused out_of_stock |
| 429 | rate_limited — ждите Retry-After секунд |
Лимиты: 60 заказов и 120 запросов каталога в минуту.
Webhook
Адрес указывается в панели → API. При смене статуса заказа придёт:
POST https://your-site.com/donatix-hook
X-Donatix-Timestamp: 1767225600
X-Donatix-Signature: 5d41402abc4b2a76b9719d911017c592
{"event": "order.updated", "order": {"order_id": "dx-1042", "status": "completed"}}
Подпись — HMAC-SHA256 от timestamp + "." + тело вашим секретом. Ответьте 2xx, иначе повторим до 5 раз.
import hmac, hashlib
def valid(secret: str, timestamp: str, body: bytes, signature: str) -> bool:
mac = hmac.new(secret.encode(), timestamp.encode() + b"." + body, hashlib.sha256)
return hmac.compare_digest(mac.hexdigest(), signature)
Примеры
import uuid, requests
API = "https://donatix.tj/api/v1"
H = {"X-API-Key": "dx_live_..."}
def buy_stars(username: str, amount: int) -> dict:
r = requests.post(f"{API}/orders", headers={**H, "Idempotency-Key": str(uuid.uuid4())},
json={"product_id": "tg-stars", "quantity": amount,
"fields": {"telegram_username": username}}, timeout=30)
data = r.json()
if not data["ok"]:
raise RuntimeError(data["error"])
return data["order"]
const res = await fetch("https://donatix.tj/api/v1/orders", {
method: "POST",
headers: { "X-API-Key": process.env.DONATIX_KEY, "Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json" },
body: JSON.stringify({ product_id: "tg-stars", quantity: 100,
fields: { telegram_username: "@player" } }),
});
const data = await res.json();
if (!data.ok) throw new Error(data.error);