Donatix

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Выполнен, коды — в delivery
failedНе выполнен, деньги уже на балансе

Методы

GET/meПрофиль, баланс, уровень
GET/balanceБаланс в USD
GET/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, Premiumtelegram_username
Пополнения игрplayer_id, иногда сервер или зона
Подарочные карты, ключи игрнет, только quantity
Пополнение Steamsteam_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"}
HTTPcode
400missing_field invalid_field invalid_quantity account_not_found
401unauthorized
402insufficient_balance
403account_inactive account_blocked
404product_not_found not_found
409idempotency_key_reused out_of_stock
429rate_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);