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

Справочник API: Магазин

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

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

Эндпоинты

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

Эндпоинты: Магазин
ЭндпоинтПравоОписание
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:writeRestock 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:writeBuy an item for a member
POST/guilds/{guildId}/shop/members/{userId}/grantsshop:writeGive an item to a member for free
POST/guilds/{guildId}/shop/purchases/{purchaseId}/refundshop:writeRefund a purchase

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

List stores

GET/guilds/{guildId}/shop/stores

Право: shop:read

The built-in Main store (id: null, items without a store) first, then the stores in their order.

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

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

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
itemsarray of objectДа
items[].idinteger | nullДаnull = the built-in Main store
items[].mainbooleanДа
items[].namestring | nullДаnull for the Main store
items[].emojistring | nullДа
items[].descriptionstring | nullДа
items[].colorstring | nullДа
items[].enabledbooleanДа
items[].channelIdsarray of stringДа
items[].itemCountintegerДа
Ответ · 200
{
  "items": [
    {
      "id": 98765,
      "main": true,
      "name": "Example",
      "emoji": "🪙",
      "description": "example",
      "color": "#18d7ff",
      "enabled": true,
      "channelIds": [
        "234567890123456789"
      ],
      "itemCount": 10
    }
  ]
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/stores" \
  -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/shop/stores', {
  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/shop/stores",
    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

List items

GET/guilds/{guildId}/shop/items

Право: shop:read

In sort order. Only enabled items unless includeDisabled=true; hidden items are included (hidden: true).

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

Параметры
ИмяГдеТипОбязательноеОписание
guildIdпутьstringДаID вашего сервера · Discord ID (строка)
storeIdquery"main"Нет
categoryquerystringНет1–32 символов
includeDisabledquerystringНетОдно из 1, 0, true, false

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
itemsarray of objectДа
items[].idintegerДа
items[].storeIdinteger | nullДаnull = Main store
items[].namestringДа
items[].descriptionstring | nullДа
items[].emojistring | nullДа
items[].priceintegerДа
items[].typestringДаОдно из role, color, item
items[].categorystring | nullДа
items[].roleIdstring | nullДа
items[].durationSecintegerДаTimed role length; 0 = permanent
items[].consumablebooleanДа
items[].fulfillmentbooleanДаStaff deliver it (fulfilment request)
items[].stockinteger | nullДаnull = unlimited
items[].perUserLimitinteger | nullДа
items[].requiredRoleIdsarray of stringДа
items[].minLevelintegerДа
items[].enabledbooleanДа
items[].hiddenbooleanДа
items[].sortOrderintegerДа
currencyobjectДа
currency.namestringДа
currency.pluralstringДа
currency.emojistring | nullДа
Ответ · 200
{
  "items": [
    {
      "id": 98765,
      "storeId": 98765,
      "name": "Example",
      "description": "example",
      "emoji": "🪙",
      "price": 250,
      "type": "role",
      "category": "example",
      "roleId": "234567890123456789",
      "durationSec": 10,
      "consumable": true,
      "fulfillment": true,
      "stock": 10,
      "perUserLimit": 10,
      "requiredRoleIds": [
        "234567890123456789"
      ],
      "minLevel": 10,
      "enabled": true,
      "hidden": true,
      "sortOrder": 10
    }
  ],
  "currency": {
    "name": "Example",
    "plural": "example",
    "emoji": "🪙"
  }
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/items" \
  -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/shop/items', {
  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/shop/items",
    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

Get an item

GET/guilds/{guildId}/shop/items/{itemId}

Право: shop:read

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

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

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
idintegerДа
storeIdinteger | nullДаnull = Main store
namestringДа
descriptionstring | nullДа
emojistring | nullДа
priceintegerДа
typestringДаОдно из role, color, item
categorystring | nullДа
roleIdstring | nullДа
durationSecintegerДаTimed role length; 0 = permanent
consumablebooleanДа
fulfillmentbooleanДаStaff deliver it (fulfilment request)
stockinteger | nullДаnull = unlimited
perUserLimitinteger | nullДа
requiredRoleIdsarray of stringДа
minLevelintegerДа
enabledbooleanДа
hiddenbooleanДа
sortOrderintegerДа
Ответ · 200
{
  "id": 98765,
  "storeId": 98765,
  "name": "Example",
  "description": "example",
  "emoji": "🪙",
  "price": 250,
  "type": "role",
  "category": "example",
  "roleId": "234567890123456789",
  "durationSec": 10,
  "consumable": true,
  "fulfillment": true,
  "stock": 10,
  "perUserLimit": 10,
  "requiredRoleIds": [
    "234567890123456789"
  ],
  "minLevel": 10,
  "enabled": true,
  "hidden": true,
  "sortOrder": 10
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/items/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/shop/items/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/shop/items/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)

Ошибки

Restock or turn an item on/off

PATCH/guilds/{guildId}/shop/items/{itemId}

Право: shop:writeЧувствительное

Like /shopadmin restock and toggle. Send stock (null = unlimited) and/or enabled.

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

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

Тело запроса

Тело запроса
ПолеТипОбязательноеОписание
enabledbooleanНетOff = not listed, not buyable
stockinteger | nullНетNew stock; null = unlimited
0–1 000 000

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
idintegerДа
storeIdinteger | nullДаnull = Main store
namestringДа
descriptionstring | nullДа
emojistring | nullДа
priceintegerДа
typestringДаОдно из role, color, item
categorystring | nullДа
roleIdstring | nullДа
durationSecintegerДаTimed role length; 0 = permanent
consumablebooleanДа
fulfillmentbooleanДаStaff deliver it (fulfilment request)
stockinteger | nullДаnull = unlimited
perUserLimitinteger | nullДа
requiredRoleIdsarray of stringДа
minLevelintegerДа
enabledbooleanДа
hiddenbooleanДа
sortOrderintegerДа
Ответ · 200
{
  "id": 98765,
  "storeId": 98765,
  "name": "Example",
  "description": "example",
  "emoji": "🪙",
  "price": 250,
  "type": "role",
  "category": "example",
  "roleId": "234567890123456789",
  "durationSec": 10,
  "consumable": true,
  "fulfillment": true,
  "stock": 10,
  "perUserLimit": 10,
  "requiredRoleIds": [
    "234567890123456789"
  ],
  "minLevel": 10,
  "enabled": true,
  "hidden": true,
  "sortOrder": 10
}

Примеры

curl
curl -s -X PATCH "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/items/234567890123456789" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true,"stock":10}'
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/shop/items/234567890123456789', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.BOTGG_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    enabled: true,
    stock: 10,
  }),
});
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.patch(
    "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/items/234567890123456789",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
    },
    json={
        "enabled": True,
        "stock": 10,
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

A member’s inventory

GET/guilds/{guildId}/shop/members/{userId}/inventory

Право: shop:read

Non-refunded purchases (owned and used), newest first; roleActive = a granted role that hasn’t expired or been removed.

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

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

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
itemsarray of objectДа
items[].idintegerДа
items[].itemIdinteger | nullДаnull when the item was deleted (the snapshot stays)
items[].storeIdinteger | nullДа
items[].storeNamestring | nullДа
items[].itemNamestringДа
items[].itemEmojistring | nullДа
items[].itemTypestringДа
items[].userIdstringДа
items[].priceintegerДа0 for free grants
items[].statusstringДаОдно из owned, used, refunded
items[].roleIdstring | nullДа
items[].expiresAtstring | nullДа
items[].roleRemovedAtstring | nullДа
items[].fulfillmentstringДаОдно из none, pending, done
items[].bankTransactionIdinteger | nullДа
items[].refundTransactionIdinteger | nullДа
items[].usedAtstring | nullДа
items[].refundedAtstring | nullДа
items[].createdAtstringДа
items[].roleActivebooleanДа
Ответ · 200
{
  "items": [
    {
      "id": 98765,
      "itemId": 98765,
      "storeId": 98765,
      "storeName": "example",
      "itemName": "example",
      "itemEmoji": "🪙",
      "itemType": "example",
      "userId": "876543210987654321",
      "price": 250,
      "status": "owned",
      "roleId": "234567890123456789",
      "expiresAt": "2026-10-07T12:00:00.000Z",
      "roleRemovedAt": "2026-10-07T12:00:00.000Z",
      "fulfillment": "none",
      "bankTransactionId": 98765,
      "refundTransactionId": 98765,
      "usedAt": "2026-10-07T12:00:00.000Z",
      "refundedAt": "2026-10-07T12:00:00.000Z",
      "createdAt": "2026-10-07T12:00:00.000Z",
      "roleActive": true
    }
  ]
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/members/876543210987654321/inventory" \
  -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/shop/members/876543210987654321/inventory', {
  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/shop/members/876543210987654321/inventory",
    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

List purchases

GET/guilds/{guildId}/shop/purchases

Право: shop:read

The purchase ledger, newest first. Pass before=<nextCursor> for the next page.

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

Параметры
ИмяГдеТипОбязательноеОписание
guildIdпутьstringДаID вашего сервера · Discord ID (строка)
limitqueryintegerНет1–100 · По умолчанию 25
beforequeryintegerНетне меньше 1
userIdquerystringНетDiscord ID (строка)
itemIdqueryintegerНетне меньше 1
storeIdquery"main"Нет
statusquerystringНетОдно из owned, used, refunded

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
itemsarray of objectДа
items[].idintegerДа
items[].itemIdinteger | nullДаnull when the item was deleted (the snapshot stays)
items[].storeIdinteger | nullДа
items[].storeNamestring | nullДа
items[].itemNamestringДа
items[].itemEmojistring | nullДа
items[].itemTypestringДа
items[].userIdstringДа
items[].priceintegerДа0 for free grants
items[].statusstringДаОдно из owned, used, refunded
items[].roleIdstring | nullДа
items[].expiresAtstring | nullДа
items[].roleRemovedAtstring | nullДа
items[].fulfillmentstringДаОдно из none, pending, done
items[].bankTransactionIdinteger | nullДа
items[].refundTransactionIdinteger | nullДа
items[].usedAtstring | nullДа
items[].refundedAtstring | nullДа
items[].createdAtstringДа
nextCursorstring | nullДа
Ответ · 200
{
  "items": [
    {
      "id": 98765,
      "itemId": 98765,
      "storeId": 98765,
      "storeName": "example",
      "itemName": "example",
      "itemEmoji": "🪙",
      "itemType": "example",
      "userId": "876543210987654321",
      "price": 250,
      "status": "owned",
      "roleId": "234567890123456789",
      "expiresAt": "2026-10-07T12:00:00.000Z",
      "roleRemovedAt": "2026-10-07T12:00:00.000Z",
      "fulfillment": "none",
      "bankTransactionId": 98765,
      "refundTransactionId": 98765,
      "usedAt": "2026-10-07T12:00:00.000Z",
      "refundedAt": "2026-10-07T12:00:00.000Z",
      "createdAt": "2026-10-07T12:00:00.000Z"
    }
  ],
  "nextCursor": "98700"
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/purchases?limit=25" \
  -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/shop/purchases?limit=25', {
  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/shop/purchases",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
    },
    params={
        "limit": 25,
    },
    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

Get a purchase

GET/guilds/{guildId}/shop/purchases/{purchaseId}

Право: shop:read

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

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

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
idintegerДа
itemIdinteger | nullДаnull when the item was deleted (the snapshot stays)
storeIdinteger | nullДа
storeNamestring | nullДа
itemNamestringДа
itemEmojistring | nullДа
itemTypestringДа
userIdstringДа
priceintegerДа0 for free grants
statusstringДаОдно из owned, used, refunded
roleIdstring | nullДа
expiresAtstring | nullДа
roleRemovedAtstring | nullДа
fulfillmentstringДаОдно из none, pending, done
bankTransactionIdinteger | nullДа
refundTransactionIdinteger | nullДа
usedAtstring | nullДа
refundedAtstring | nullДа
createdAtstringДа
Ответ · 200
{
  "id": 98765,
  "itemId": 98765,
  "storeId": 98765,
  "storeName": "example",
  "itemName": "example",
  "itemEmoji": "🪙",
  "itemType": "example",
  "userId": "876543210987654321",
  "price": 250,
  "status": "owned",
  "roleId": "234567890123456789",
  "expiresAt": "2026-10-07T12:00:00.000Z",
  "roleRemovedAt": "2026-10-07T12:00:00.000Z",
  "fulfillment": "none",
  "bankTransactionId": 98765,
  "refundTransactionId": 98765,
  "usedAt": "2026-10-07T12:00:00.000Z",
  "refundedAt": "2026-10-07T12:00:00.000Z",
  "createdAt": "2026-10-07T12:00:00.000Z"
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/purchases/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/shop/purchases/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/shop/purchases/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)

Ошибки

Buy an item for a member

POST/guilds/{guildId}/shop/members/{userId}/purchases

Право: shop:writeЧувствительноеIdempotency-Key

Same rules as /shop: the price is charged from the member’s Bank balance in one transaction with the stock and limits; requirements (roles, level) apply. A role item’s role is given right away (if Discord refuses, nothing is charged). Fulfilment requests and the Shop log are posted like a /shop purchase.

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

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

Тело запроса

Тело запроса
ПолеТипОбязательноеОписание
itemIdintegerДане меньше 1
expectedPriceintegerНетRefused with SHOP_ITEM_UNAVAILABLE (price_changed) when the price differs
0–1 000 000 000

Ответ

Поля ответа · 201
ПолеТипОбязательноеОписание
purchaseobjectДа
purchase.idintegerДа
purchase.itemIdinteger | nullДаnull when the item was deleted (the snapshot stays)
purchase.storeIdinteger | nullДа
purchase.storeNamestring | nullДа
purchase.itemNamestringДа
purchase.itemEmojistring | nullДа
purchase.itemTypestringДа
purchase.userIdstringДа
purchase.priceintegerДа0 for free grants
purchase.statusstringДаОдно из owned, used, refunded
purchase.roleIdstring | nullДа
purchase.expiresAtstring | nullДа
purchase.roleRemovedAtstring | nullДа
purchase.fulfillmentstringДаОдно из none, pending, done
purchase.bankTransactionIdinteger | nullДа
purchase.refundTransactionIdinteger | nullДа
purchase.usedAtstring | nullДа
purchase.refundedAtstring | nullДа
purchase.createdAtstringДа
balanceinteger | nullДаThe member’s balance afterwards (null when unchanged)
Ответ · 201
{
  "purchase": {
    "id": 98765,
    "itemId": 98765,
    "storeId": 98765,
    "storeName": "example",
    "itemName": "example",
    "itemEmoji": "🪙",
    "itemType": "example",
    "userId": "876543210987654321",
    "price": 250,
    "status": "owned",
    "roleId": "234567890123456789",
    "expiresAt": "2026-10-07T12:00:00.000Z",
    "roleRemovedAt": "2026-10-07T12:00:00.000Z",
    "fulfillment": "none",
    "bankTransactionId": 98765,
    "refundTransactionId": 98765,
    "usedAt": "2026-10-07T12:00:00.000Z",
    "refundedAt": "2026-10-07T12:00:00.000Z",
    "createdAt": "2026-10-07T12:00:00.000Z"
  },
  "balance": 1350
}

Примеры

curl
curl -s -X POST "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/members/876543210987654321/purchases" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"itemId":98765,"expectedPrice":10}'
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/shop/members/876543210987654321/purchases', {
  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({
    itemId: 98765,
    expectedPrice: 10,
  }),
});
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/shop/members/876543210987654321/purchases",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),  # reuse it when you retry this request
    },
    json={
        "itemId": 98765,
        "expectedPrice": 10,
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Give an item to a member for free

POST/guilds/{guildId}/shop/members/{userId}/grants

Право: shop:writeЧувствительноеIdempotency-Key

A staff grant: recorded as a purchase with price 0, no Bank change. Ignores the item’s on/off switch, a closed store, requirements and the per-member limit; stock still applies. A role item’s role is given right away.

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

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

Тело запроса

Тело запроса
ПолеТипОбязательноеОписание
itemIdintegerДане меньше 1
reasonstring | nullНетShown in the audit log
до 200 символов

Ответ

Поля ответа · 201
ПолеТипОбязательноеОписание
purchaseobjectДа
purchase.idintegerДа
purchase.itemIdinteger | nullДаnull when the item was deleted (the snapshot stays)
purchase.storeIdinteger | nullДа
purchase.storeNamestring | nullДа
purchase.itemNamestringДа
purchase.itemEmojistring | nullДа
purchase.itemTypestringДа
purchase.userIdstringДа
purchase.priceintegerДа0 for free grants
purchase.statusstringДаОдно из owned, used, refunded
purchase.roleIdstring | nullДа
purchase.expiresAtstring | nullДа
purchase.roleRemovedAtstring | nullДа
purchase.fulfillmentstringДаОдно из none, pending, done
purchase.bankTransactionIdinteger | nullДа
purchase.refundTransactionIdinteger | nullДа
purchase.usedAtstring | nullДа
purchase.refundedAtstring | nullДа
purchase.createdAtstringДа
balanceinteger | nullДаThe member’s balance afterwards (null when unchanged)
Ответ · 201
{
  "purchase": {
    "id": 98765,
    "itemId": 98765,
    "storeId": 98765,
    "storeName": "example",
    "itemName": "example",
    "itemEmoji": "🪙",
    "itemType": "example",
    "userId": "876543210987654321",
    "price": 250,
    "status": "owned",
    "roleId": "234567890123456789",
    "expiresAt": "2026-10-07T12:00:00.000Z",
    "roleRemovedAt": "2026-10-07T12:00:00.000Z",
    "fulfillment": "none",
    "bankTransactionId": 98765,
    "refundTransactionId": 98765,
    "usedAt": "2026-10-07T12:00:00.000Z",
    "refundedAt": "2026-10-07T12:00:00.000Z",
    "createdAt": "2026-10-07T12:00:00.000Z"
  },
  "balance": 1350
}

Примеры

curl
curl -s -X POST "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/members/876543210987654321/grants" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"itemId":98765,"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/shop/members/876543210987654321/grants', {
  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({
    itemId: 98765,
    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/shop/members/876543210987654321/grants",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),  # reuse it when you retry this request
    },
    json={
        "itemId": 98765,
        "reason": "Tournament prize",
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Refund a purchase

POST/guilds/{guildId}/shop/purchases/{purchaseId}/refund

Право: shop:writeЧувствительноеIdempotency-Key

Like Refund in the console: the price goes back to the member’s balance (one transaction), the purchase becomes refunded, optionally restocked; a granted role is removed by the bot within ~30 s.

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

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

Тело запроса

Тело запроса
ПолеТипОбязательноеОписание
restockbooleanНетPut the unit back in stock (default: the Shop’s “restock on refund” setting)
forcebooleanНетAlso refund an item that was already used
reasonstring | nullНетShown in the audit log
до 200 символов

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
purchaseobjectДа
purchase.idintegerДа
purchase.itemIdinteger | nullДаnull when the item was deleted (the snapshot stays)
purchase.storeIdinteger | nullДа
purchase.storeNamestring | nullДа
purchase.itemNamestringДа
purchase.itemEmojistring | nullДа
purchase.itemTypestringДа
purchase.userIdstringДа
purchase.priceintegerДа0 for free grants
purchase.statusstringДаОдно из owned, used, refunded
purchase.roleIdstring | nullДа
purchase.expiresAtstring | nullДа
purchase.roleRemovedAtstring | nullДа
purchase.fulfillmentstringДаОдно из none, pending, done
purchase.bankTransactionIdinteger | nullДа
purchase.refundTransactionIdinteger | nullДа
purchase.usedAtstring | nullДа
purchase.refundedAtstring | nullДа
purchase.createdAtstringДа
balanceinteger | nullДаThe member’s balance afterwards (null when unchanged)
Ответ · 200
{
  "purchase": {
    "id": 98765,
    "itemId": 98765,
    "storeId": 98765,
    "storeName": "example",
    "itemName": "example",
    "itemEmoji": "🪙",
    "itemType": "example",
    "userId": "876543210987654321",
    "price": 250,
    "status": "owned",
    "roleId": "234567890123456789",
    "expiresAt": "2026-10-07T12:00:00.000Z",
    "roleRemovedAt": "2026-10-07T12:00:00.000Z",
    "fulfillment": "none",
    "bankTransactionId": 98765,
    "refundTransactionId": 98765,
    "usedAt": "2026-10-07T12:00:00.000Z",
    "refundedAt": "2026-10-07T12:00:00.000Z",
    "createdAt": "2026-10-07T12:00:00.000Z"
  },
  "balance": 1350
}

Примеры

curl
curl -s -X POST "https://console.botgg.app/api/v1/guilds/123456789012345678/shop/purchases/234567890123456789/refund" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"restock":true,"force":true,"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/shop/purchases/234567890123456789/refund', {
  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({
    restock: true,
    force: true,
    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/shop/purchases/234567890123456789/refund",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),  # reuse it when you retry this request
    },
    json={
        "restock": True,
        "force": True,
        "reason": "Tournament prize",
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

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

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