Donatix
Документация

Donatix API

Один API для всех товаров: Telegram Stars и Premium, пополнения игр, подарочные карты.

Базовый URL
https://donatix.duckdns.org/api/v1
Аутентификация
X-API-Key: dx_live_…
Или Authorization: Bearer dx_live_…. Ключ создаётся в панели → API.

Быстрый старт

1. Узнайте баланс:

curl -s https://donatix.duckdns.org/api/v1/balance -H "X-API-Key: $KEY"
{"ok": true, "balance": "100.0000", "currency": "USD"}

2. Найдите товар:

curl -s "https://donatix.duckdns.org/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.duckdns.org/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Не выполнен, деньги уже вернулись на баланс. Причина — в error.

Методы

МетодПутьЧто делает
GET/meПрофиль, баланс, уровень, сколько потрачено.
GET/balanceБаланс в USD.
GET/transactions?page=1&limit=20Движение денег: списания и начисления.
GET/transactions/tx123Одна транзакция.
GET/categoriesКатегории товаров (игры, бренды карт).
GET/products?kind=&category_id=&q=Товары с вашей ценой. kind: telegram_stars, telegram_premium, steam_topup, steam_gift, topup, gift_card.
GET/products/{product_id}Один товар.
POST/ordersСоздать заказ: product_id, quantity, fields.
GET/steam-gifts/games?q=Поиск игр для Steam-гифтов по названию или AppID.
GET/steam-gifts/games/{appid}Издания игры и цены по регионам (ваши цены).
GET/orders?page=&limit=&status=Ваши заказы.
GET/orders/{order_id}Один заказ со статусом и выдачей.

Полная схема: Swagger · OpenAPI JSON

Поля заказа

У каждого товара есть список fields — что нужно передать в заказе:

Для Telegram Stars quantity — количество звёзд, цена указана за одну звезду.

Ошибки

{"ok": false, "error": "Недостаточно средств: нужно $1.6605, на балансе $0.5000.", "code": "insufficient_balance"}
HTTPcodeЧто значит
400missing_field, invalid_field, invalid_quantity, validation_errorНеверные данные запроса.
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:

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)

Пример: Python

import uuid, requests

API = "https://donatix.duckdns.org/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"]

Пример: Node.js

const res = await fetch("https://donatix.duckdns.org/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);