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

Справочник API: Розыгрыши

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

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

Эндпоинты

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

Эндпоинты: Розыгрыши
ЭндпоинтПравоОписание
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

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

List giveaways

GET/guilds/{guildId}/giveaways

Право: giveaways:read

status: active, scheduled, ended, cancelled or open (= scheduled + active). Running ones by end time, others newest first.

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

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

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
itemsarray of objectДа
items[].idintegerДа
items[].statusstringДаОдно из scheduled, active, ended, cancelled
items[].prizestringДа
items[].descriptionstring | nullДа
items[].channelIdstringДа
items[].messageUrlstring | nullДаnull until the bot posted it
items[].winnersCountintegerДа
items[].startsAtstringДа
items[].endsAtstringДа
items[].endedAtstring | nullДа
items[].entrantsintegerДа
items[].entriesintegerДаTickets incl. bonus entries
items[].winnerIdsarray of stringДа
items[].hostIdstringДа
items[].requirementsobjectДа
items[].pingRoleIdstring | nullДа
items[].dmWinnersbooleanДа
items[].createdAtstringДа
totalintegerДа
pageintegerДа
nextPageinteger | nullДа
Ответ · 200
{
  "items": [
    {
      "id": 98765,
      "status": "scheduled",
      "prize": "Nitro",
      "description": "example",
      "channelId": "234567890123456789",
      "messageUrl": "https://example.com",
      "winnersCount": 10,
      "startsAt": "2026-10-07T12:00:00.000Z",
      "endsAt": "2026-10-07T12:00:00.000Z",
      "endedAt": "2026-10-07T12:00:00.000Z",
      "entrants": 42,
      "entries": 10,
      "winnerIds": [
        "234567890123456789"
      ],
      "hostId": "234567890123456789",
      "requirements": {},
      "pingRoleId": "234567890123456789",
      "dmWinners": true,
      "createdAt": "2026-10-07T12:00:00.000Z"
    }
  ],
  "total": 10,
  "page": 10,
  "nextPage": 10
}

Примеры

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

Start a giveaway

POST/guilds/{guildId}/giveaways

Право: giveaways:writeIdempotency-Key

Saved as scheduled; the bot posts it in the channel within ~10 s (or at startsAt). Same rules as the console editor. Look and DM setting default to the server’s Giveaways settings.

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

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

Тело запроса

Тело запроса
ПолеТипОбязательноеОписание
channelIdstringДаDiscord ID (строка)
prizestringДа1–200 символов
descriptionstring | nullНетдо 1 000 символов
winnersintegerНетDefault 1
1–50
startsAtstring | nullНетISO 8601; omitted / null = start now
Дата и время ISO 8601 (UTC)
endsAtstringНетISO 8601; or send durationSeconds
Дата и время ISO 8601 (UTC)
durationSecondsintegerНетFrom the start; or send endsAt
60–5 184 000
requirementsobjectНетRequired / blocked roles, account and member age, level, entry cost, bonus roles
requirements.roleIdsarray of stringНетдо 20 элементов · По умолчанию []
requirements.roleModestringНетОдно из any, all · По умолчанию "any"
requirements.blockedRoleIdsarray of stringНетдо 20 элементов · По умолчанию []
requirements.minAccountAgeDaysintegerНет0–3 650 · По умолчанию 0
requirements.minMemberDaysintegerНет0–3 650 · По умолчанию 0
requirements.minLevelintegerНет0–1 000 · По умолчанию 0
requirements.entryCostintegerНет0–1 000 000 000 · По умолчанию 0
requirements.bonusRolesarray of objectНетдо 10 элементов · По умолчанию []
requirements.bonusRoles[].roleIdstringДаDiscord ID (строка)
requirements.bonusRoles[].entriesintegerДа2–10
embedobjectНетDefault: the server’s Giveaways look
embed.colorstringНетПо умолчанию "#D94CFF"
embed.endedColorstringНетПо умолчанию "#4E5058"
embed.emojistringНет1–64 символов · По умолчанию "🎉"
embed.imageUrlstring | nullНетдо 500 символов · По умолчанию null
embed.thumbnailUrlstring | nullНетдо 500 символов · По умолчанию null
pingRoleIdstring | nullНетDiscord ID (строка)
dmWinnersbooleanНетDefault: the server setting
hostIdstring | nullНетShown as the host; default: the API key’s creator
Discord ID (строка)

Ответ

Поля ответа · 201
ПолеТипОбязательноеОписание
idintegerДа
statusstringДаОдно из scheduled, active, ended, cancelled
prizestringДа
descriptionstring | nullДа
channelIdstringДа
messageUrlstring | nullДаnull until the bot posted it
winnersCountintegerДа
startsAtstringДа
endsAtstringДа
endedAtstring | nullДа
entrantsintegerДа
entriesintegerДаTickets incl. bonus entries
winnerIdsarray of stringДа
hostIdstringДа
requirementsobjectДа
pingRoleIdstring | nullДа
dmWinnersbooleanДа
createdAtstringДа
Ответ · 201
{
  "id": 98765,
  "status": "scheduled",
  "prize": "Nitro",
  "description": "example",
  "channelId": "234567890123456789",
  "messageUrl": "https://example.com",
  "winnersCount": 10,
  "startsAt": "2026-10-07T12:00:00.000Z",
  "endsAt": "2026-10-07T12:00:00.000Z",
  "endedAt": "2026-10-07T12:00:00.000Z",
  "entrants": 42,
  "entries": 10,
  "winnerIds": [
    "234567890123456789"
  ],
  "hostId": "234567890123456789",
  "requirements": {},
  "pingRoleId": "234567890123456789",
  "dmWinners": true,
  "createdAt": "2026-10-07T12:00:00.000Z"
}

Примеры

curl
curl -s -X POST "https://console.botgg.app/api/v1/guilds/123456789012345678/giveaways" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"channelId":"234567890123456789","prize":"Nitro","description":"example","winners":1,"startsAt":"2026-10-07T12:00:00.000Z","endsAt":"2026-10-07T12:00:00.000Z","durationSeconds":3600,"requirements":{"roleIds":[],"roleMode":"any","blockedRoleIds":[],"minAccountAgeDays":0,"minMemberDays":0,"minLevel":0,"entryCost":0,"bonusRoles":[]},"embed":{"color":"#D94CFF","endedColor":"#4E5058","emoji":"🎉","imageUrl":"https://example.com","thumbnailUrl":"https://example.com"},"pingRoleId":"234567890123456789","dmWinners":true,"hostId":"234567890123456789"}'
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/giveaways', {
  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({
    channelId: '234567890123456789',
    prize: 'Nitro',
    description: 'example',
    winners: 1,
    startsAt: '2026-10-07T12:00:00.000Z',
    endsAt: '2026-10-07T12:00:00.000Z',
    durationSeconds: 3600,
    requirements: {
      roleIds: [],
      roleMode: 'any',
      blockedRoleIds: [],
      minAccountAgeDays: 0,
      minMemberDays: 0,
      minLevel: 0,
      entryCost: 0,
      bonusRoles: [],
    },
    embed: {
      color: '#D94CFF',
      endedColor: '#4E5058',
      emoji: '🎉',
      imageUrl: 'https://example.com',
      thumbnailUrl: 'https://example.com',
    },
    pingRoleId: '234567890123456789',
    dmWinners: true,
    hostId: '234567890123456789',
  }),
});
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/giveaways",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),  # reuse it when you retry this request
    },
    json={
        "channelId": "234567890123456789",
        "prize": "Nitro",
        "description": "example",
        "winners": 1,
        "startsAt": "2026-10-07T12:00:00.000Z",
        "endsAt": "2026-10-07T12:00:00.000Z",
        "durationSeconds": 3600,
        "requirements": {
            "roleIds": [],
            "roleMode": "any",
            "blockedRoleIds": [],
            "minAccountAgeDays": 0,
            "minMemberDays": 0,
            "minLevel": 0,
            "entryCost": 0,
            "bonusRoles": [],
        },
        "embed": {
            "color": "#D94CFF",
            "endedColor": "#4E5058",
            "emoji": "🎉",
            "imageUrl": "https://example.com",
            "thumbnailUrl": "https://example.com",
        },
        "pingRoleId": "234567890123456789",
        "dmWinners": True,
        "hostId": "234567890123456789",
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Get a giveaway

GET/guilds/{guildId}/giveaways/{giveawayId}

Право: giveaways:read

With entry counts, winners per draw and the latest queued actions (to follow an end / reroll).

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

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

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
idintegerДа
statusstringДаОдно из scheduled, active, ended, cancelled
prizestringДа
descriptionstring | nullДа
channelIdstringДа
messageUrlstring | nullДаnull until the bot posted it
winnersCountintegerДа
startsAtstringДа
endsAtstringДа
endedAtstring | nullДа
entrantsintegerДа
entriesintegerДаTickets incl. bonus entries
winnerIdsarray of stringДа
hostIdstringДа
requirementsobjectДа
pingRoleIdstring | nullДа
dmWinnersbooleanДа
createdAtstringДа
winnersarray of objectДа
winners[].userIdstringДа
winners[].drawintegerДа0 = the end draw, 1.. = rerolls
winners[].drawnAtstringДа
actionsarray of objectДаThe latest queued actions (end / reroll / …), newest first
actions[].idintegerДа
actions[].actionstringДа
actions[].statusstringДаОдно из pending, processing, done, failed
actions[].errorstring | nullДа
actions[].createdAtstringДа
actions[].processedAtstring | nullДа
Ответ · 200
{
  "id": 98765,
  "status": "scheduled",
  "prize": "Nitro",
  "description": "example",
  "channelId": "234567890123456789",
  "messageUrl": "https://example.com",
  "winnersCount": 10,
  "startsAt": "2026-10-07T12:00:00.000Z",
  "endsAt": "2026-10-07T12:00:00.000Z",
  "endedAt": "2026-10-07T12:00:00.000Z",
  "entrants": 42,
  "entries": 10,
  "winnerIds": [
    "234567890123456789"
  ],
  "hostId": "234567890123456789",
  "requirements": {},
  "pingRoleId": "234567890123456789",
  "dmWinners": true,
  "createdAt": "2026-10-07T12:00:00.000Z",
  "winners": [
    {
      "userId": "876543210987654321",
      "draw": 10,
      "drawnAt": "2026-10-07T12:00:00.000Z"
    }
  ],
  "actions": [
    {
      "id": 98765,
      "action": "example",
      "status": "pending",
      "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/giveaways/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/giveaways/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/giveaways/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)

Ошибки

List a giveaway’s entrants

GET/guilds/{guildId}/giveaways/{giveawayId}/entries

Право: giveaways:read

Ordered by user id. Pass after=<nextCursor> for the next page. weight = tickets (bonus roles), paid = entry cost paid.

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

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

Ответ

Поля ответа · 200
ПолеТипОбязательноеОписание
itemsarray of objectДа
items[].userIdstringДа
items[].weightintegerДа
items[].paidintegerДа
items[].enteredAtstringДа
nextCursorstring | nullДа
Ответ · 200
{
  "items": [
    {
      "userId": "876543210987654321",
      "weight": 10,
      "paid": 10,
      "enteredAt": "2026-10-07T12:00:00.000Z"
    }
  ],
  "nextCursor": "98700"
}

Примеры

curl
curl -s "https://console.botgg.app/api/v1/guilds/123456789012345678/giveaways/234567890123456789/entries?limit=50" \
  -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/giveaways/234567890123456789/entries?limit=50', {
  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/giveaways/234567890123456789/entries",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
    },
    params={
        "limit": 50,
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

End a giveaway now

POST/guilds/{guildId}/giveaways/{giveawayId}/end

Право: giveaways:writeIdempotency-Key

Queued for the bot, which draws the winners and announces them within ~5 s (202). Follow it with GET …/giveaways/{giveawayId}.

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

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

Ответ

Поля ответа · 202
ПолеТипОбязательноеОписание
giveawayIdintegerДа
actionobjectДа
action.idintegerДа
action.actionstringДа
action.statusstringДаОдно из pending, processing, done, failed
action.errorstring | nullДа
action.createdAtstringДа
action.processedAtstring | nullДа
Ответ · 202
{
  "giveawayId": 98765,
  "action": {
    "id": 98765,
    "action": "example",
    "status": "pending",
    "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/giveaways/234567890123456789/end" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
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/giveaways/234567890123456789/end', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.BOTGG_API_KEY}`,
    'Idempotency-Key': crypto.randomUUID(), // reuse it when you retry this request
  },
});
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/giveaways/234567890123456789/end",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),  # reuse it when you retry this request
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

Reroll winners

POST/guilds/{guildId}/giveaways/{giveawayId}/reroll

Право: giveaways:writeIdempotency-Key

For an ended giveaway: the bot draws count new winners (never someone who already won) within ~5 s (202).

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

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

Тело запроса

Тело запроса
ПолеТипОбязательноеОписание
countintegerНетDefault 1
1–20

Ответ

Поля ответа · 202
ПолеТипОбязательноеОписание
giveawayIdintegerДа
actionobjectДа
action.idintegerДа
action.actionstringДа
action.statusstringДаОдно из pending, processing, done, failed
action.errorstring | nullДа
action.createdAtstringДа
action.processedAtstring | nullДа
Ответ · 202
{
  "giveawayId": 98765,
  "action": {
    "id": 98765,
    "action": "example",
    "status": "pending",
    "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/giveaways/234567890123456789/reroll" \
  -H "Authorization: Bearer $BOTGG_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"count":12}'
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/giveaways/234567890123456789/reroll', {
  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({
    count: 12,
  }),
});
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/giveaways/234567890123456789/reroll",
    headers={
        "Authorization": f"Bearer {os.environ['BOTGG_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),  # reuse it when you retry this request
    },
    json={
        "count": 12,
    },
    timeout=10,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {data['error']}: {data['message']}")
print(data)

Ошибки

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

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