REST API v1 · למפתחים

ה-API של BotGG למפתחים: שרת הדיסקורד שלכם מתחבר לכל דבר

ה-REST API של BotGG מאפשר לאתר, לשרת המשחק או לבקאנד שלכם לקרוא ולשנות את נתוני BotGG בשרת הדיסקורד — לחלק פרסים דרך הבנק, לסנכרן XP מהמשחק, לתגמל על הזמנות או להציג טבלאות מובילים באתר. יוצרים מפתח בקונסולה, שולחים בקשת HTTPS אחת, וזהו.

  • כתובת בסיס: https://console.botgg.app/api/v1
  • JSON על גבי HTTPS, מפתחות Authorization: Bearer עם הרשאות לכל משאב
  • תיאור קריא-מכונה של כל נקודות הקצה ב-OpenAPI 3.1
  • בתוכנית החינמית: 2 מפתחות, 60 בקשות לדקה לכל מפתח
תיעוד למפתחים
בעמוד הזה

סקירה כללית

מה שהחברים עושים עם BotGG בדיסקורד — יתרות, רמות, הזמנות ועוד — זמין גם לקוד שלכם. כל חלק של BotGG הוא משאב עם נקודות קצה והרשאות משלו; כולם מופיעים במדריך העיון.

  • כתובת בסיס: https://console.botgg.app/api/v1. ב-HTTPS בלבד.
  • הבקשות והתשובות ב-JSON (Content-Type: application/json).
  • המזהים הם snowflakes של דיסקורד (17–20 ספרות), והם תמיד נשלחים ומוחזרים כמחרוזות.
  • כל מפתח שייך לשרת אחד ועובד רק בשרת הזה — ראו אימות.
  • שרת-לשרת בלבד: בקשות מדפדפנים נדחות, כך שמפתח לעולם לא יגיע לקוד צד-לקוח.

התחלה מהירה

  1. פתחו את הקונסולה, בחרו שרת ועברו ל-API בתפריט הצד (נדרשת הרשאת Manage Server).
  2. צרו מפתח: תנו לו שם (למשל „אתר”), בחרו הרשאות (scopes) ותוקף אם רוצים. העתיקו את המפתח מיד — הוא מוצג פעם אחת בלבד.
  3. שמרו אותו כסוד בשרת שלכם, למשל במשתנה הסביבה BOTGG_API_KEY.
  4. שלחו את הבקשה הראשונה — למשל קריאת היתרה של חבר/ה בבנק (הרשאה bank:read).
curl
curl -s https://console.botgg.app/api/v1/guilds/123456789012345678/bank/members/876543210987654321 \
  -H "Authorization: Bearer $BOTGG_API_KEY"
תשובה · 200
{
  "userId": "876543210987654321",
  "balance": 1250,
  "currency": { "name": "Coin", "plural": "Coins", "emoji": "🪙" }
}

כל משאב דורש שהפיצ׳ר שלו יהיה מופעל בשרת; אחרת נקודות הקצה שלו מחזירות 409 FEATURE_DISABLED (BANK_DISABLED עבור הבנק). כל קודי השגיאה נמצאים בדף השגיאות.

מדריך עיון לפי משאב

דף עיון לכל משאב, שנוצר מאותו רישום שמפעיל את ה-API — פרמטרים, שדות בקשה ותשובה, הרשאות, קודי שגיאה ודוגמאות מוכנות ב-curl, JavaScript ו-Python:

כל נקודות הקצה

כל הנתיבים יחסיים ל-https://console.botgg.app/api/v1. {guildId} הוא המזהה של השרת שלכם, ו-{userId} הוא מזהה הדיסקורד של החבר/ה. נקודות קצה שמסומנות רגישה דורשות הרשאה שפועלת על חברים או חושפת נתוני ניהול.

כל נקודות הקצה של REST API v1
נקודת קצההרשאהתיאור
GET/guilds/{guildId}guild:readGet the server
GET/guilds/{guildId}/rolesguild:readList roles
GET/guilds/{guildId}/channelsguild:readList channels
GET/guilds/{guildId}/members/{userId}guild:readGet a member
GET/guilds/{guildId}/bank/members/{userId}bank:readGet a member’s balance
GET/guilds/{guildId}/bank/members/{userId}/transactionsbank:readList a member’s transactions
POST/guilds/{guildId}/bank/members/{userId}/transactionsbank:writeAdd to or remove from a member’s balance
GET/guilds/{guildId}/bank/leaderboardbank:readTop balances
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/guilds/{guildId}/invites/members/{userId}invites:readGet a member’s invites
GET/guilds/{guildId}/invites/leaderboardinvites:readInvites leaderboard
POST/guilds/{guildId}/invites/members/{userId}/bonusinvites:writeAdd or remove bonus invites
GET/guilds/{guildId}/ticketstickets:readList tickets
GET/guilds/{guildId}/tickets/{ticketNo}tickets:readGet a ticket
GET/guilds/{guildId}/tickets/{ticketNo}/transcripttickets:readGet a closed ticket’s transcript
POST/guilds/{guildId}/tickets/{ticketNo}/closetickets:writeClose a ticket
GET/guilds/{guildId}/applications/formsapplications:readList application forms
GET/guilds/{guildId}/applications/submissionsapplications:readList applications
GET/guilds/{guildId}/applications/submissions/{number}applications:readGet an application
POST/guilds/{guildId}/applications/submissions/{number}/decisionapplications:writeAccept or deny an application
GET/guilds/{guildId}/appealsappeals:readList ban appeals
GET/guilds/{guildId}/appeals/{number}appeals:readGet a ban appeal
POST/guilds/{guildId}/appeals/{number}/approveappeals:write רגישהApprove a ban appeal (unban)
POST/guilds/{guildId}/appeals/{number}/rejectappeals:write רגישהReject a ban appeal
GET/guilds/{guildId}/moderation/casesmoderation:read רגישהList moderation cases
GET/guilds/{guildId}/moderation/cases/{number}moderation:read רגישהGet a moderation case
POST/guilds/{guildId}/moderation/users/{userId}/warnmoderation:write רגישהWarn a member
POST/guilds/{guildId}/moderation/users/{userId}/timeoutmoderation:write רגישהTime out a member
POST/guilds/{guildId}/moderation/users/{userId}/untimeoutmoderation:write רגישהRemove a member’s timeout
POST/guilds/{guildId}/moderation/users/{userId}/kickmoderation:write רגישהKick a member
POST/guilds/{guildId}/moderation/users/{userId}/banmoderation:write רגישהBan a user
POST/guilds/{guildId}/moderation/users/{userId}/unbanmoderation:write רגישהUnban a user
GET/guilds/{guildId}/moderation/actions/{actionId}moderation:write רגישהGet the result of a moderation action
GET/guilds/{guildId}/shop/storesshop:readList stores
GET/guilds/{guildId}/shop/itemsshop:readList items
GET/guilds/{guildId}/shop/items/{itemId}shop:readGet an item
PATCH/guilds/{guildId}/shop/items/{itemId}shop:write רגישהRestock or turn an item on/off
GET/guilds/{guildId}/shop/members/{userId}/inventoryshop:readA member’s inventory
GET/guilds/{guildId}/shop/purchasesshop:readList purchases
GET/guilds/{guildId}/shop/purchases/{purchaseId}shop:readGet a purchase
POST/guilds/{guildId}/shop/members/{userId}/purchasesshop:write רגישהBuy an item for a member
POST/guilds/{guildId}/shop/members/{userId}/grantsshop:write רגישהGive an item to a member for free
POST/guilds/{guildId}/shop/purchases/{purchaseId}/refundshop:write רגישהRefund a purchase
GET/guilds/{guildId}/giveawaysgiveaways:readList giveaways
POST/guilds/{guildId}/giveawaysgiveaways:writeStart a giveaway
GET/guilds/{guildId}/giveaways/{giveawayId}giveaways:readGet a giveaway
GET/guilds/{guildId}/giveaways/{giveawayId}/entriesgiveaways:readList a giveaway’s entrants
POST/guilds/{guildId}/giveaways/{giveawayId}/endgiveaways:writeEnd a giveaway now
POST/guilds/{guildId}/giveaways/{giveawayId}/rerollgiveaways:writeReroll winners
GET/guilds/{guildId}/flowsflows:readList flows
GET/guilds/{guildId}/flows/runs/{executionId}flows:readGet a flow run
POST/guilds/{guildId}/flows/{workflowId}/runsflows:run רגישהRun a flow

אותו תיאור זמין כמסמך OpenAPI 3.1 — ייבאו אותו ל-Postman, ל-Insomnia או למחולל לקוחות. הגרסה העדכנית (בלי מפתח) נמצאת ב-https://console.botgg.app/api/v1/openapi.json.

איך ה-API מתנהג

דוגמאות מלאות

שינוי יתרה מלא: מפתח אידמפוטנטיות אחד לכל שינוי, המתנה ב-429/503 וטיפול ב-INSUFFICIENT_FUNDS. הריצו אותו בשרת, לעולם לא בדפדפן.

Node.js · bank.mjs
// 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 · bank.py
# 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"])

שאלות נפוצות

האם ה-API של BotGG חינמי?

כן. כל שרת יכול ליצור בחינם 2 מפתחות API עם 60 בקשות לדקה לכל מפתח. ב-Pro המגבלה עולה ל-10 מפתחות ול-600 בקשות לדקה.

אפשר לקרוא ל-API מ-JavaScript בדפדפן?

לא. ה-API מקבל רק בקשות שרת-לשרת: כל בקשה עם כותרת Origin נדחית. קראו לו מהבקאנד שלכם והעבירו את התוצאה לדף — כך המפתח נשאר סודי.

איך מחלקים לחברים מטבע מהמשחק או מהאתר?

צרו מפתח עם ההרשאה bank:write ושלחו POST /guilds/{guildId}/bank/members/{userId}/transactions עם {"type":"add","amount":100}. הוסיפו כותרת Idempotency-Key כדי שניסיונות חוזרים לעולם לא ישלמו פעמיים.

יש מפרט OpenAPI?

כן. ה-API מפרסם מסמך OpenAPI 3.1 שנוצר מרישום נקודות הקצה: הגרסה העדכנית ב-https://console.botgg.app/api/v1/openapi.json, ואפשר להוריד אותו מכל דף בתיעוד. ייבאו אותו ל-Postman, ל-Insomnia או למחולל קוד.

מה עושים אם מפתח API דלף?

בטלו אותו בקונסולה מיד — הוא מפסיק לעבוד באותו רגע — וצרו מפתח חדש. כל שינוי בבנק שנעשה עם מפתח מופיע ביומן הבנק עם שם המפתח, כך שאפשר לבדוק מה הוא עשה.

מוכנים לשדרג את השרת?

מוסיפים את BotGG בחינם ומפעילים יכולות בקונסולת הווב.