REST API v1 · Разработчикам
API BotGG для разработчиков: ваш Discord-сервер в любых проектах
REST API BotGG позволяет вашему сайту, игровому серверу или бэкенду читать и менять данные BotGG на Discord-сервере: выдавать призы через Банк, синхронизировать опыт из игры, награждать за приглашения или выводить топы на сайте. Создайте ключ в консоли — и достаточно одного HTTPS-запроса.
- Базовый URL:
https://console.botgg.app/api/v1 - JSON по HTTPS, ключи
Authorization: Bearerс правами по разделам - Машиночитаемое описание всех эндпоинтов в формате OpenAPI 3.1
- Бесплатный тариф: 2 ключа, 60 запросов в минуту на ключ
Документация для разработчиков
На этой странице
Обзор
То, что участники делают с BotGG в Discord, — балансы, уровни, приглашения и многое другое — доступно и вашему коду. Каждая часть BotGG — это раздел API со своими эндпоинтами и правами; все они перечислены в справочнике.
- Базовый URL:
https://console.botgg.app/api/v1. Только HTTPS. - Запросы и ответы — в JSON (
Content-Type: application/json). - ID — это сноуфлейки Discord (17–20 цифр); они всегда передаются и возвращаются строками.
- Каждый ключ привязан к одному серверу и работает только на нём — см. авторизацию.
- Только «сервер — сервер»: запросы из браузера отклоняются, поэтому ключ никогда не окажется во фронтенде.
Быстрый старт
- Откройте консоль, выберите сервер и перейдите в раздел API в боковом меню (нужно право «Управлять сервером»).
- Создайте ключ: задайте название (например, «Сайт»), выберите права (scopes) и, при желании, срок действия. Сразу скопируйте ключ — он показывается только один раз.
- Сохраните его как секрет на своём сервере, например в переменной окружения
BOTGG_API_KEY. - Отправьте первый запрос — например, узнайте баланс участника в Банке (право
bank:read).
curl -s https://console.botgg.app/api/v1/guilds/123456789012345678/bank/members/876543210987654321 \
-H "Authorization: Bearer $BOTGG_API_KEY"{
"userId": "876543210987654321",
"balance": 1250,
"currency": { "name": "Coin", "plural": "Coins", "emoji": "🪙" }
}Для каждого раздела на сервере должен быть включён соответствующий модуль, иначе его эндпоинты отвечают 409 FEATURE_DISABLED (для Банка — BANK_DISABLED). Все коды ошибок — на странице ошибок.
Справочник API по разделам
Для каждого раздела — своя страница справочника, созданная из того же реестра, на котором работает API: параметры, поля запроса и ответа, права, коды ошибок и готовые примеры на curl, JavaScript и Python:
Все эндпоинты
Все пути указаны относительно https://console.botgg.app/api/v1. {guildId} — ID вашего сервера, {userId} — Discord ID участника. Эндпоинтам с пометкой Чувствительное нужно право, которое действует на участников или открывает данные модерации.
То же описание доступно как документ OpenAPI 3.1 — импортируйте его в Postman, Insomnia или генератор клиентов. Актуальная версия (без ключа) — по адресу https://console.botgg.app/api/v1/openapi.json.
Как работает API
- Авторизация и API-ключи — формат ключа, права, срок действия, отзыв и безопасность.
- Ошибки — формат ошибок и все коды с HTTP-статусами.
- Лимиты запросов — запросы в минуту на ключ по тарифам и заголовки
X-RateLimit-*. - Безопасные повторы — заголовок
Idempotency-Key, с которым повтор записи безопасен. - Вебхуки — подписанные события, которые BotGG отправляет на ваш сервер, и код проверки подписи.
- ИИ-ассистенты и MCP — работа с API из инструментов ИИ.
Полные примеры
Полный пример изменения баланса: один ключ идемпотентности на операцию, ожидание при 429/503 и обработка INSUFFICIENT_FUNDS. Запускайте его на сервере, а не в браузере.
// Node.js 22+ (built-in fetch). Run it on your server — never in a browser or game client.
const API = 'https://console.botgg.app/api/v1';
const KEY = process.env.BOTGG_API_KEY; // a key with the bank:write scope, kept in a secret
const GUILD_ID = '123456789012345678';
export async function changeBalance(userId, type, amount, reason) {
// One Idempotency-Key per logical change: every retry below reuses it, so the change happens once.
const idempotencyKey = crypto.randomUUID();
for (let attempt = 1; attempt <= 3; attempt++) {
const res = await fetch(`${API}/guilds/${GUILD_ID}/bank/members/${userId}/transactions`, {
method: 'POST',
headers: {
Authorization: `Bearer ${KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': idempotencyKey,
},
body: JSON.stringify({ type, amount, reason }),
});
const data = await res.json();
if (res.ok) return data; // 201 — or the original response, replayed
if (res.status === 429 || res.status === 503) {
const seconds = Number(res.headers.get('Retry-After')) || attempt * 2;
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
continue;
}
if (data.error === 'INSUFFICIENT_FUNDS') {
throw new Error(`Not enough balance: the member has ${data.balance}`);
}
throw new Error(`${res.status} ${data.error}: ${data.message}`);
}
throw new Error('BotGG API is busy, try again later');
}
const tx = await changeBalance('876543210987654321', 'add', 100, 'Tournament prize');
console.log(`New balance: ${tx.balance}`);# Python 3 + requests. Run it on your server — never ship the key to clients.
import os, time, uuid
import requests
API = "https://console.botgg.app/api/v1"
KEY = os.environ["BOTGG_API_KEY"] # a key with the bank:write scope
GUILD_ID = "123456789012345678"
def change_balance(user_id, type_, amount, reason=None):
idempotency_key = str(uuid.uuid4()) # one per logical change, reused on every retry
for attempt in range(1, 4):
res = requests.post(
f"{API}/guilds/{GUILD_ID}/bank/members/{user_id}/transactions",
headers={"Authorization": f"Bearer {KEY}", "Idempotency-Key": idempotency_key},
json={"type": type_, "amount": amount, "reason": reason},
timeout=10,
)
data = res.json()
if res.ok:
return data # 201 — or the original response, replayed
if res.status_code in (429, 503):
time.sleep(int(res.headers.get("Retry-After", attempt * 2)))
continue
raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
raise RuntimeError("BotGG API is busy, try again later")
print(change_balance("876543210987654321", "add", 100, "Tournament prize")["balance"])