開発者
Bot API ドキュメント
サーバー所有者が、自分の Discord サーバーのデータをウェブサイトやツール、ウィジェットに表示するための、小さな読み取り専用 API です。
認証
ダッシュボードの Bot API ページでトークンを作成し、Authorization ヘッダーで送信します: Authorization: Bearer <token>。トークンは1つのサーバーに属し、そのサーバーのみ読み取れます。表示は一度きりで、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 ID として現れます。データ処理を拒否したメンバーは、下記のように常に匿名で表示されます。名前、メッセージ、チケット、フォームの回答は API に含まれません。
{ "id": null, "anonymous": true }
制限
上限はサーバーのプランによって決まります。Premium 1: 有効なトークン 2 件、トークンごとに毎分 60 リクエスト。Premium 2: トークン 5 件、毎分 120。Premium 3: トークン 10 件、毎分 300。無料トライアルとスポンサーサーバーは Premium 1 として扱われます。IP アドレスごとに毎分300リクエストまで可能です。超えると Retry-After ヘッダー付きで 429 が返ります。プランが下がってもトークンは失効しません。お持ちのトークンはそのまま動作し、上限以下になるまで新規作成だけができなくなります。サーバーには有料プランまたは有効なトライアルが必要です。
キャッシュ
応答には ETag と短い非公開キャッシュが付きます。変更がなければ If-None-Match を送ると 304 が返ります。30~60秒ごとのポーリングで十分です。
ブラウザーと CORS
API はご自身のサーバーから呼び出してください。CORS は既定でオフです。ウェブページが訪問者のブラウザーから呼び出す必要がある場合は、トークンに許可するウェブサイトを1つ設定します。他のオリジンからのリクエストは拒否されます。ウェブページ内のものはすべて訪問者に見えます。
トークン、プラン、上限
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 } }
リクエスト ID
すべてのレスポンスに 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 | パスのギルドがトークンのギルドと一致しません。 |
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 | 一時的に利用できません。後でもう一度お試しください。 |