Разработчикам
Документация API бота
Небольшой API только для чтения, чтобы владельцы серверов могли показывать данные своего сервера Discord на сайте, в инструментах и виджетах.
Аутентификация
Создайте токен на странице API бота в панели и отправляйте его в заголовке Authorization: Authorization: Bearer <token>. Токен принадлежит одному серверу и читает только его. Он показывается один раз; DayZ Hub хранит только его отпечаток.
curl -H "Authorization: Bearer dhba_..." \ https://dayzhub.net/api/v1/bot/guilds/<guildId>
Базовый URL: https://dayzhub.net/api/v1/bot
Эндпоинты
| Method | Path | Область |
|---|---|---|
GET | /me | — |
GET | /guilds/{guildId} | guild:read |
GET | /guilds/{guildId}/features | guild:read |
GET | /guilds/{guildId}/giveaways | giveaways:read |
GET | /guilds/{guildId}/giveaways/{id} | giveaways:read |
GET | /guilds/{guildId}/tickets/summary | tickets:read |
GET | /guilds/{guildId}/leaderboard/levels | leveling:read |
GET | /guilds/{guildId}/shop/products | shop:read |
GET | /guilds/{guildId}/suggestions/summary | suggestions:read |
GET | /guilds/{guildId}/server-status | server-status:read |
Каждый ответ — JSON в одной и той же обёртке. Списки разбиты на страницы через limit (от 1 до 100) и курсор из page.nextCursor.
{ "ok": true, "data": [ ... ], "page": { "limit": 25, "hasMore": true, "nextCursor": "eyJpZCI6Ij..." } }
Области
У каждого токена только те области, которые вы ему дали. Все они только для чтения; через этот API ничего изменить нельзя.
guild:read | Статус тарифа и список функций |
giveaways:read | Розыгрыши (активные и завершённые) с числом участников |
tickets:read | Число тикетов по статусу и категории (без содержимого тикетов) |
leveling:read | Таблица уровней (отказавшиеся участники анонимны) |
shop:read | Публичные товары магазина пожертвований |
suggestions:read | Число предложений по статусу |
server-status:read | Публичный статус игрового сервера (только если он публично в списке) |
Конфиденциальность участников
Участники появляются только там, где функция уже показывает их публично, как идентификатор Discord. Участник, отказавшийся от обработки данных, всегда показывается анонимно, как ниже. Имена, сообщения, тикеты и ответы форм никогда не входят в API.
{ "id": null, "anonymous": true }
Лимиты
Лимиты зависят от тарифа сервера. Premium 1: активных токенов 2, запросов в минуту на токен 60. Premium 2: токенов 5, 120 в минуту. Premium 3: токенов 10, 300 в минуту. Бесплатный пробный период и спонсируемый сервер считаются как Premium 1. Каждый IP-адрес может делать 300 запросов в минуту. При превышении вы получите 429 с заголовком Retry-After. Понижение тарифа не отзывает ни один токен: имеющиеся продолжают работать, блокируется только создание новых, пока вы не окажетесь ниже лимита. Серверу нужен платный тариф или активный пробный период.
Кэширование
Ответы содержат ETag и короткий приватный кэш. Отправьте If-None-Match, чтобы получить 304, если ничего не изменилось. Опроса раз в 30–60 секунд более чем достаточно.
Браузеры и CORS
Вызывайте API со своего сервера. CORS по умолчанию выключен. Если веб-странице нужно вызывать его из браузера посетителя, укажите у токена один разрешённый сайт; запросы с любого другого источника отклоняются. Всё, что есть на веб-странице, видно посетителям.
Ваш токен, тариф и лимиты
GET /me не проверяет тариф. Помимо самого токена он возвращает plan (premium1, premium2, premium3 или none), limits (tokens и perMinute этого тарифа) и tokensUsed (активные токены сервера). rateLimitPerMin — скорость, которая есть у этого токена сейчас.
{ "ok": true, "data": { "guildId": "123456789012345678", "name": "Website", "prefix": "dhba_aB3dE", "scopes": ["guild:read"],
"allowedOrigin": null, "rateLimitPerMin": 120, "createdAt": "2026-10-01T12:00:00.000Z",
"plan": "premium2", "limits": { "tokens": 5, "perMinute": 120 }, "tokensUsed": 2 } }
Идентификаторы запросов
Каждый ответ содержит заголовок X-Request-Id. Если вы отправите свой X-Request-Id (до 64 букв, цифр и символов . _ : -), он сохранится, иначе он будет создан. В ошибках он повторяется как requestId. Назовите его, когда обращаетесь в поддержку.
X-Request-Id: 3f2b8c1e-5a7d-4e0b-9c64-1d2e3f4a5b6c
{ "ok": false, "error": "rate_limited", "code": "rate_limited", "message": "Too many requests", "requestId": "3f2b8c1e-5a7d-4e0b-9c64-1d2e3f4a5b6c" }
Ошибки
Ошибки — это JSON с ok: false, стабильным кодом в code (error содержит то же значение), коротким сообщением и requestId. Ориентируйтесь на код, а не на текст сообщения.
400 bad_request / bad_cursor | Один из параметров недопустим (limit, cursor, status или id). |
401 unauthorized / invalid_token | Токен отсутствует, неверен, неизвестен или отозван. |
403 guild_mismatch | Сервер (guild) в пути не совпадает с сервером токена. |
403 missing_scope | У токена нет области, нужной для этого эндпоинта. |
403 origin_not_allowed | Заголовок Origin не совпадает с разрешённым сайтом токена. |
403 plan_required | У сервера нет платного тарифа или активного пробного периода. |
403 feature_not_in_plan | Функция не входит в тариф сервера. |
404 not_found / shop_not_enabled | Здесь ничего нет (или магазин не включён). |
405 method_not_allowed | Доступен только GET; API только для чтения. |
429 rate_limited | Слишком много запросов. Подождите столько секунд, сколько указано в Retry-After. |
503 unavailable | Временно недоступно. Попробуйте позже. |