REST API v1 · Разработчикам · Справочник API

Справочник API: Уровни

Все 4 эндпоинта раздела «Уровни» в REST API BotGG v1: права, параметры, поля, ошибки и готовые примеры на curl, JavaScript и Python.

Документация для разработчиков
На этой странице

Эндпоинты

Пути указаны относительно https://console.botgg.app/api/v1. Передавайте API-ключ в заголовке Authorization: Bearer botgg_…; ID — строки.

Эндпоинты: Уровни
ЭндпоинтПравоОписание
GET/guilds/{guildId}/levels/members/{userId}levels:readGet a member’s level
GET/guilds/{guildId}/levels/leaderboardlevels:readXP leaderboard
POST/guilds/{guildId}/levels/members/{userId}/xp-changeslevels:writeAdd, remove or set a member’s XP
GET/guilds/{guildId}/levels/xp-changes/{changeId}levels:writeGet the status of an XP change

Кроме собственных ошибок (см. ниже), любой эндпоинт может вернуть эти общие:

Get a member’s level

GET/guilds/{guildId}/levels/members/{userId}

Право: levels:read

Level, XP, progress and XP rank. Members without activity get zeros. Live activity can take a few seconds to show.

На сервере должен быть включён модуль: Уровни

Параметры
ИмяГдеТипОбязательноеОписание
guildIdпутьstringДаID вашего сервера · Discord ID (строка)
userIdпутьstringДаDiscord ID участника · Discord ID (строка)

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
userIdstringДа
xpintegerДа
levelintegerДа
xpIntoLevelintegerДа
xpForNextintegerДа
progressnumberДа0–1 inside the current level
messagesintegerДа
voiceMinutesintegerДа
streakintegerДа
bestStreakintegerДа
rankinteger | nullДаBy XP; null without XP
hiddenbooleanДаThe member hid themselves from public leaderboards (/rank leaderboard:hide)
lastXpAtstring | nullДа
Ответ · 200
{
  "userId": "876543210987654321",
  "xp": 150,
  "level": 5,
  "xpIntoLevel": 10,
  "xpForNext": 10,
  "progress": 10,
  "messages": 10,
  "voiceMinutes": 10,
  "streak": 10,
  "bestStreak": 10,
  "rank": 1,
  "hidden": true,
  "lastXpAt": "2026-10-07T12:00:00.000Z"
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/members/876543210987654321" \
  -H "Authorization: Bearer $BOTGG_API_KEY"
JavaScript (fetch)
// Node.js 18+ (built-in fetch) — on your server, never in a browser
const res = await fetch('https://console.botgg.app/api/v1/guilds/123456789012345678/levels/members/876543210987654321', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.BOTGG_API_KEY}`,
  },
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.error}: ${data.message}`);
console.log(data);
Python (requests)
import os
import requests

res = requests.get(
    "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/members/876543210987654321",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Ошибки
HTTPКоды
409FEATURE_DISABLED
503SERVICE_UNAVAILABLE

XP leaderboard

GET/guilds/{guildId}/levels/leaderboard

Право: levels:read

Highest XP first. Pass cursor=<nextCursor> for the next page. Members who hid themselves from public leaderboards keep their rank but have userId: null — respect that if you publish the list.

На сервере должен быть включён модуль: Уровни

Параметры
ИмяГдеТипОбязательноеОписание
guildIdпутьstringДаID вашего сервера · Discord ID (строка)
limitqueryintegerНет1–100 · По умолчанию 25
cursorqueryintegerНет0–10 000 000 · По умолчанию 0

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
itemsarray of objectДа
items[].rankintegerДа
items[].userIdstring | nullДаnull for members who hid themselves from public leaderboards
items[].hiddenbooleanДа
items[].xpintegerДа
items[].levelintegerДа
items[].messagesintegerДа
items[].voiceMinutesintegerДа
totalintegerДа
nextCursorstring | nullДа
Ответ · 200
{
  "items": [
    {
      "rank": 1,
      "userId": "876543210987654321",
      "hidden": true,
      "xp": 150,
      "level": 5,
      "messages": 10,
      "voiceMinutes": 10
    }
  ],
  "total": 10,
  "nextCursor": "98700"
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/leaderboard?limit=25&cursor=0" \
  -H "Authorization: Bearer $BOTGG_API_KEY"
JavaScript (fetch)
// Node.js 18+ (built-in fetch) — on your server, never in a browser
const res = await fetch('https://console.botgg.app/api/v1/guilds/123456789012345678/levels/leaderboard?limit=25&cursor=0', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.BOTGG_API_KEY}`,
  },
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.error}: ${data.message}`);
console.log(data);
Python (requests)
import os
import requests

res = requests.get(
    "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/leaderboard",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
    },
    params={
        "limit": 25,
        "cursor": 0,
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Ошибки
HTTPКоды
409FEATURE_DISABLED
503SERVICE_UNAVAILABLE

Add, remove or set a member’s XP

POST/guilds/{guildId}/levels/members/{userId}/xp-changes

Право: levels:writeIdempotency-Key

Same as /levels give|take|set: the bot applies the change within a few seconds, then updates reward roles and posts level-up announcements. Answers 202 with a change id — poll GET …/levels/xp-changes/{changeId} for the result. Written to the audit log.

На сервере должен быть включён модуль: Уровни

Параметры
ИмяГдеТипОбязательноеОписание
guildIdпутьstringДаID вашего сервера · Discord ID (строка)
userIdпутьstringДаDiscord ID участника · Discord ID (строка)
Idempotency-KeyзаголовокstringНетНеобязательно. Передайте уникальное значение (UUID) и повторяйте его при ретраях — операция выполнится один раз. Как это работает

Тело запроса

Тело запроса
ПолеТипОбязательноеОписание
typestringДаadd / remove = relative change, set = new total
Одно из add, remove, set
amountintegerДа0–2 000 000 000
unitstringНетDefault xp. With levels, the progress inside the level is kept
Одно из xp, levels
reasonstring | nullНетShown in the audit log
до 200 символов

Ответ

Поля ответа · 202
ПолеТипОбязательноеОписание
changeIdstringДа
userIdstringДа
typestringДаОдно из add, remove, set
unitstringДаОдно из xp, levels
amountintegerДа
statusstringДаОдно из pending, processing, done, failed
resultobject | nullДаWhen done
result.previousLevelintegerДа
result.levelintegerДа
result.xpintegerДа
errorstring | nullДаWhen failed
createdAtstringДа
processedAtstring | nullДа
Ответ · 202
{
  "changeId": "234567890123456789",
  "userId": "876543210987654321",
  "type": "add",
  "unit": "xp",
  "amount": 100,
  "status": "pending",
  "result": {
    "previousLevel": 4,
    "level": 5,
    "xp": 150
  },
  "error": "example",
  "createdAt": "2026-10-07T12:00:00.000Z",
  "processedAt": "2026-10-07T12:00:00.000Z"
}

Примеры

curl
curl -s -X POST "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/members/876543210987654321/xp-changes" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"type":"add","amount":100,"unit":"xp","reason":"Tournament prize"}'
JavaScript (fetch)
// Node.js 18+ (built-in fetch) — on your server, never in a browser
const res = await fetch('https://console.botgg.app/api/v1/guilds/123456789012345678/levels/members/876543210987654321/xp-changes', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.BOTGG_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID(), // reuse it when you retry this request
  },
  body: JSON.stringify({
    type: 'add',
    amount: 100,
    unit: 'xp',
    reason: 'Tournament prize',
  }),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.error}: ${data.message}`);
console.log(data);
Python (requests)
import os, uuid
import requests

res = requests.post(
    "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/members/876543210987654321/xp-changes",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),  # reuse it when you retry this request
    },
    json={
        "type": "add",
        "amount": 100,
        "unit": "xp",
        "reason": "Tournament prize",
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Get the status of an XP change

GET/guilds/{guildId}/levels/xp-changes/{changeId}

Право: levels:write

Only changes made with the same API key. done includes the level before/after and the new XP total.

На сервере должен быть включён модуль: Уровни

Параметры
ИмяГдеТипОбязательноеОписание
guildIdпутьstringДаID вашего сервера · Discord ID (строка)
changeIdпутьstringДа

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
changeIdstringДа
userIdstringДа
typestringДаОдно из add, remove, set
unitstringДаОдно из xp, levels
amountintegerДа
statusstringДаОдно из pending, processing, done, failed
resultobject | nullДаWhen done
result.previousLevelintegerДа
result.levelintegerДа
result.xpintegerДа
errorstring | nullДаWhen failed
createdAtstringДа
processedAtstring | nullДа
Ответ · 200
{
  "changeId": "234567890123456789",
  "userId": "876543210987654321",
  "type": "add",
  "unit": "xp",
  "amount": 100,
  "status": "pending",
  "result": {
    "previousLevel": 4,
    "level": 5,
    "xp": 150
  },
  "error": "example",
  "createdAt": "2026-10-07T12:00:00.000Z",
  "processedAt": "2026-10-07T12:00:00.000Z"
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/xp-changes/234567890123456789" \
  -H "Authorization: Bearer $BOTGG_API_KEY"
JavaScript (fetch)
// Node.js 18+ (built-in fetch) — on your server, never in a browser
const res = await fetch('https://console.botgg.app/api/v1/guilds/123456789012345678/levels/xp-changes/234567890123456789', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.BOTGG_API_KEY}`,
  },
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.error}: ${data.message}`);
console.log(data);
Python (requests)
import os
import requests

res = requests.get(
    "https://console.botgg.app/api/v1/guilds/123456789012345678/levels/xp-changes/234567890123456789",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Готовы прокачать свой сервер?

Добавьте BotGG бесплатно и включайте нужные функции в веб-консоли.