Re'start 公開API ドキュメント
Re'start2ブースター向けの一般公開APIです。
ベースURL: https://restart2api.restart-reboot.com/
目次
- 概要
- 利用上の注意
- 認証
- レート制限
- 共通エラー
- user_info オブジェクト
- エンドポイント
- 認証 (ログイン・ログアウト)
- アイテム
- 素材
- スキル
- 武器
- ツール
- ペット
- プレイヤー
- ランキング
- curl 利用例
概要
このAPIを使うと、Re'startゲームの自分のデータ (アイテム・武器・ペットなど) をプログラムから取得・操作できます。
利用条件: Re'start2ブースターのみ
ブースターでなくなった場合、有効なトークンを持っていても 403 エラーになります。
利用上の注意
トークンの取り扱い
アクセストークンは絶対に第三者に渡さないでください。
特に第三者の信用できないクライアント、Webアプリ等は絶対使用しないでください。
トークンは あなた本人として APIを操作する権限を持っています。漏洩すると以下のような操作を第三者に行われる可能性があります。
- 装備している武器・スキル・ツールを変更される
- 戦闘参加ペットを無断で変更される
漏洩した場合の対処法: POST /public/auth/logout を呼ぶとトークンを即座に無効化できます。その後 /public/auth/discord/login から再ログインしてください。
期限切れトークン
401 token not found が返ってきた場合は、再度ログインしてください。
ブースター資格
ブースターでなくなった瞬間から、有効なトークンを持っていてもAPIは利用できなくなります (403)。
再びブースターになれば有効期間内のトークンを再発行しなくても利用できるようになります。
レート制限への対応
短時間に大量のリクエストを送ると 429 Too Many Requests が返ります。
retry_after_seconds に示された秒数が経過してから再試行してください。
1分間に30回のリクエストまで。
自動リトライのスクリプトを書く場合は、必ずこのフィールドを見て待機してください。
認証
Discord アカウントで本人確認を行い、APIアクセス用のBearerトークンを取得します。
フロー図
あなたのブラウザ Re'start APIサーバー Discord
| | |
| GET /public/auth/ | |
| discord/login | |
|------------------------->| |
| | 302 Redirect |
|<-------------------------| (discord.com/oauth2/...) |
| | |
| Discordでログイン・承認 | |
|--------------------------------------------------------->|
| | |
| /public/auth/discord/callback?code=xxx&state=yyy |
|<---------------------------------------------------------|
| | |
| code, state を転送 | |
|------------------------->| code -> access_token交換|
| |------------------------->|
| |<-------------------------|
| | /users/@me でID取得 |
| |------------------------->|
| |<-------------------------|
| | ブースター判定 |
| {"access_token": "..."} | |
|<-------------------------| |
| | |
| Authorization: Bearer <access_token> でAPI利用 |
|------------------------->| |
ステップ詳細
Step 1. ブラウザで以下のURLを開く
https://restart2api.restart-reboot.com/public/auth/discord/login
Discordの認可画面にリダイレクトされます。
Step 2. Discordにログインして「認可」ボタンを押す
Step 3. コールバックページのJSONレスポンスから access_token を取得する
{
"token_type": "Bearer",
"access_token": "ここのトークンをコピー",
"expires_in": 86400,
"user_id": 123456789012345678
}
Step 4. 以降のリクエストすべてに Authorization ヘッダーを付ける
Authorization: Bearer <access_token>
トークンの有効期限
- デフォルト: 86400秒 (24時間)
- 期限切れになると
401 token expiredが返ります - 再度
/public/auth/discord/loginからログインし直してください
セキュリティ
- PKCE (Proof Key for Code Exchange) を使用しているため、認可コードの横取り攻撃を防ぎます
- state パラメータは10分で失効するワンタイム値です
- トークンはリクエストごとにブースター判定をするため、ブースターでなくなると即座に利用不可になります
レート制限
APIの乱用を防ぐため、リクエスト数に上限があります。
| 項目 | 値 |
|---|---|
| 上限 | 60リクエスト / 60秒 (1ユーザーあたり) |
| カウント対象 | 認証後の全エンドポイント + コールバック |
| 超過時ステータス | 429 Too Many Requests |
超過時のレスポンス:
{
"error": "rate limit exceeded",
"limit": 30,
"window_seconds": 60,
"retry_after_seconds": 42
}
| フィールド | 型 | 説明 |
|---|---|---|
error |
string | エラー種別 |
limit |
integer | ウィンドウ内の最大リクエスト数 |
window_seconds |
integer | レート制限のウィンドウ幅 (秒) |
retry_after_seconds |
integer | この秒数待ってから再試行してください |
Retry-After レスポンスヘッダーにも同じ待機秒数が入っています。
共通エラー
すべての認証済みエンドポイントで返りうるエラーです。
401 Unauthorized — トークンなし・不正
Authorization ヘッダーが存在しない場合:
{ "error": "missing bearer token" }
Bearer プレフィックスはあるがトークン部分が空の場合:
{ "error": "invalid bearer token" }
トークンが存在しない (未発行・削除済み) 場合:
{ "error": "token not found" }
トークンの有効期限が切れている場合:
{ "error": "token expired" }
トークン期限切れの場合は、再度
/public/auth/discord/loginからログインしてください。
403 Forbidden — ブースター権限なし
{ "error": "booster required" }
トークン発行後にブースターでなくなった場合も、このエラーが返ります。
429 Too Many Requests — レート制限超過
{
"error": "rate limit exceeded",
"limit": 30,
"window_seconds": 60,
"retry_after_seconds": 42
}
retry_after_seconds 秒待ってから再試行してください。
user_info オブジェクト
認証済みエンドポイントのレスポンスには user_info オブジェクトが含まれます。
{
"user_id": 123456789012345678,
"display_name": "表示名",
"avatar_url": "https://cdn.discordapp.com/avatars/123456789012345678/xxxx.png",
"global_name": "グローバル名",
"user_name": "ユーザー名"
}
| フィールド | 型 | 説明 |
|---|---|---|
user_id |
integer | DiscordユーザーID |
display_name |
string | サーバー上の表示名。BOTがユーザーを認識できない場合は "Unknown" |
avatar_url |
string | null | アバター画像のURL。アバターが未設定の場合は null |
global_name |
string | null | Discordのグローバル表示名。未設定の場合は null |
user_name |
string | Discordユーザー名 (@ 以降)。BOTがユーザーを認識できない場合は "Unknown" |
注意: BOTが対象ユーザーと共通のサーバーに参加していない場合、
display_nameとuser_nameは"Unknown"、avatar_urlとglobal_nameはnullになることがあります。
エンドポイント
認証エンドポイント
GET /public/auth/discord/login
Discord OAuth2 認可画面へリダイレクトします。
認証不要
ブラウザで直接アクセスしてください。APIクライアントで叩いた場合は 302 Found とリダイレクト先URLが返ります。
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
500 |
{"error": "CLIENT_ID is not configured"} |
環境変数 RESTART2_PUBLIC_DISCORD_CLIENT_ID が未設定 |
500 |
{"error": "RESTART2_PUBLIC_DISCORD_REDIRECT_URI is not configured"} |
環境変数 RESTART2_PUBLIC_DISCORD_REDIRECT_URI が未設定 |
POST /public/auth/logout
現在使用しているBearerトークンを即座に無効化します。トークンが漏洩した場合などに使用してください。
認証必要 (ログアウト対象のトークンをヘッダーに付けて送信)
成功レスポンス (200):
{ "status": "ok" }
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
401 |
{"error": "missing bearer token"} |
Authorization ヘッダーがない |
401 |
{"error": "token not found"} |
指定したトークンが存在しない (既に無効・期限切れ) |
ログアウト後は再度
/public/auth/discord/loginからログインしてください。
レート制限・ブースター判定は行いません。
GET /public/auth/discord/callback
Discord からのコールバックを受け取り、本人確認・ブースター判定後にAPIトークンを発行します。
認証不要
通常はブラウザが自動でアクセスします (Discord のリダイレクト先のため)。
クエリパラメータ (Discordが自動付与):
| 名前 | 型 | 説明 |
|---|---|---|
code |
string | Discord が発行した認可コード |
state |
string | CSRF対策用のワンタイムトークン |
成功レスポンス (200):
{
"token_type": "Bearer",
"access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"expires_in": 86400,
"user_id": 123456789012345678
}
| フィールド | 型 | 説明 |
|---|---|---|
token_type |
string | 常に "Bearer" |
access_token |
string | APIアクセス用トークン。以降のリクエストで使用する |
expires_in |
integer | トークンの有効期限 (秒) |
user_id |
integer | ログインしたDiscordユーザーのID |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "discord oauth failed", "oauth_error": "...", "oauth_error_description": "..."} |
Discordが認可を拒否 (ユーザーがキャンセルするなど) |
400 |
{"error": "missing code or state"} |
クエリパラメータ code または state がない |
400 |
{"error": "invalid state"} |
state が不正 (改ざん・不一致) |
400 |
{"error": "state expired"} |
state の有効期限切れ (10分経過) |
400 |
{"error": "failed to exchange token", "discord_status": 400, "discord_response": {...}} |
Discordでのコード交換に失敗 |
400 |
{"error": "missing access_token in discord response"} |
Discordのレスポンスにアクセストークンがない |
400 |
{"error": "failed to fetch user profile", "discord_status": 401, "discord_response": {...}} |
Discordユーザー情報の取得に失敗 |
400 |
{"error": "discord response has no user id"} |
DiscordのユーザーIDが取得できない |
400 |
{"error": "invalid user id from discord"} |
DiscordのユーザーIDが数値に変換できない |
403 |
{"error": "booster required"} |
ブースターではない |
429 |
(レート制限) | リクエスト過多 |
500 |
{"error": "CLIENT_ID is not configured"} |
環境変数未設定 |
500 |
{"error": "RESTART2_PUBLIC_DISCORD_CLIENT_SECRET is not configured"} |
環境変数未設定 |
500 |
{"error": "RESTART2_PUBLIC_DISCORD_REDIRECT_URI is not configured"} |
環境変数未設定 |
502 |
{"error": "discord api request failed", "detail": "..."} |
Discord APIへの通信自体に失敗 |
アイテム
GET /public/me/items
所持アイテムの一覧を取得します。所持数が0のアイテムは含まれません。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"items": [
{
"item_id": 1,
"item_name": "木のツルハシ",
"count": 5
},
{
"item_id": 1001,
"item_name": "透明のポーション",
"count": 2
}
],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
user_id |
integer | 自分のDiscordユーザーID |
items |
array | アイテムの配列 (空の場合は []) |
items[].item_id |
integer | アイテムID |
items[].item_name |
string | アイテム名。未知のIDは "unknown" |
items[].count |
integer | 所持数 (常に1以上) |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス: 共通エラー のみ
GET /public/me/items/{item_id}
特定アイテムの所持数を取得します。所持していない場合は count: 0 が返ります (404ではありません)。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
item_id |
integer | アイテムID |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"item_id": 1001,
"item_name": "透明のポーション",
"count": 5,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
item_id |
integer | 取得したアイテムID |
item_name |
string | アイテム名。未知のIDは "unknown" |
count |
integer | 所持数 (所持していない場合は 0) |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid item_id"} |
item_id が整数に変換できない |
401 / 403 / 429 |
(共通エラー) |
素材
GET /public/me/materials
所持素材の一覧を取得します。所持数が0の素材は含まれません。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"materials": [
{
"material_id": 1,
"material_name": "木材",
"count": 30
},
{
"material_id": 2,
"material_name": "丸石",
"count": 123
}
],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
materials |
array | 素材の配列 (空の場合は []) |
materials[].material_id |
integer | 素材ID |
materials[].material_name |
string | 素材名。未知のIDは "unknown" |
materials[].count |
integer | 所持数 (常に1以上) |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス: 共通エラー のみ
GET /public/me/materials/{material_id}
特定素材の所持数を取得します。所持していない場合は count: 0 が返ります。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
material_id |
integer | 素材ID |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"material_id": 1,
"material_name": "木材",
"count": 30,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
material_id |
integer | 取得した素材ID |
material_name |
string | 素材名。未知のIDは "unknown" |
count |
integer | 所持数 (所持していない場合は 0) |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid material_id"} |
material_id が整数に変換できない |
401 / 403 / 429 |
(共通エラー) |
スキル
GET /public/me/skills
所持スキルの一覧を取得します。所持数が0のスキルは含まれません。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"skills": [
{
"skill_id": 1,
"skill_name": "ダイアゴナル",
"count": 1
},
{
"skill_id": 10,
"skill_name": "即死魔法",
"count": 10
}
],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
skills |
array | スキルの配列 (空の場合は []) |
skills[].skill_id |
integer | スキルID |
skills[].skill_name |
string | スキル名。未知のIDは "unknown" |
skills[].count |
integer | 所持数 (常に1以上) |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス: 共通エラー のみ
GET /public/me/skills/{skill_id}
特定スキルの所持数を取得します。所持していない場合は count: 0 が返ります。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
skill_id |
integer | スキルID |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"skill_id": 1,
"skill_name": "ダイアゴナル",
"count": 1,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
skill_id |
integer | 取得したスキルID |
skill_name |
string | スキル名。未知のIDは "unknown" |
count |
integer | 所持数 (所持していない場合は 0) |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid skill_id"} |
skill_id が整数に変換できない |
401 / 403 / 429 |
(共通エラー) |
POST /public/me/skill/{skill_id}/set
スキルを装備または解除します。
skill_id=0を指定すると強制解除- 所持していないスキルIDを指定すると自動的に解除扱いになります
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
skill_id |
integer | 装備するスキルID。0 で解除 |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"equipped_skill_id": 3001,
"status": "ok",
"removed": false,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
equipped_skill_id |
integer | 実際に装備されたスキルID。解除時は 0 |
status |
string | 常に "ok" |
removed |
boolean | true のとき解除された |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid skill_id"} |
skill_id が整数に変換できない |
401 / 403 / 429 |
(共通エラー) |
武器
このゲームでは武器はカテゴリー (武器種) > 個体 (weapon_number) の2段階で管理されています。
- weapon_id: 武器の種類 (例: 鉄の剣=101)
- weapon_number: 各武器個体に付けられた一意の番号。装備・詳細取得はこれを使います
GET /public/me/weapon_categories
所持している武器のカテゴリー一覧を取得します。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"weapon_categories": [
{
"weapon_id": 101,
"weapon_name": "木の剣",
"count": 3
}
],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
weapon_categories |
array | カテゴリーの配列 (空の場合は []) |
weapon_categories[].weapon_id |
integer | 武器カテゴリーID |
weapon_categories[].weapon_name |
string | 武器名。未知のIDは "unknown" |
weapon_categories[].count |
integer | そのカテゴリーの所持個数 |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス: 共通エラー のみ
GET /public/me/weapon_categories/{weapon_id}
特定カテゴリーに属する武器個体の一覧を取得します。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
weapon_id |
integer | 武器カテゴリーID |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"weapons": [
{
"weapon_number": 1,
"weapon_name": "木の剣",
"is_equipped": true,
"proficiency": 150,
"nbt": "{\"damage\": 1,1, \"steal_bonus\": true, \"proficiency_bonus\": true, \"minecraft_id\": \"minecraft:iron_sword\"}",
"shortcut_id": 0,
"enchant_count": 2
}
],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
weapon_number |
integer | 武器の個体番号。装備・詳細取得に使用 |
weapon_name |
string | 武器名 |
is_equipped |
boolean | 現在装備中かどうか |
proficiency |
integer | 武器熟練度 |
nbt |
string | 武器の特殊パラメータ (JSON文字列) |
shortcut_id |
integer | ショートカット番号 (未設定時は 0) |
enchant_count |
integer | エンチャント数 |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス: 共通エラー のみ
GET /public/me/weapons/{weapon_number}
特定の武器個体の詳細情報とエンチャント一覧を取得します。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
weapon_number |
integer | 武器の個体番号 |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"weapon_number": 1,
"weapon_name": "鉄の剣",
"weapon_id": 101,
"is_equipped": true,
"proficiency": 150,
"nbt": "{\"damage\": 1,1, \"steal_bonus\": true, \"proficiency_bonus\": true, \"minecraft_id\": \"minecraft:iron_sword\"}",
"shortcut_id": 0,
"enchant_count": 2,
"enchantments": [1, 2],
"enchantments_names": ["ドロップ確率増加", "熟練度効果増加"],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
weapon_number |
integer | 武器の個体番号 |
weapon_name |
string | 武器名 |
weapon_id |
integer | 武器カテゴリーID |
is_equipped |
boolean | 現在装備中かどうか |
proficiency |
integer | 武器熟練度 |
nbt |
string | 武器の特殊パラメータ (JSON文字列) |
shortcut_id |
integer | ショートカット番号 |
enchant_count |
integer | エンチャント総数 |
enchantments |
integer[] | エンチャントIDの配列 |
enchantments_names |
string[] | エンチャント名の配列。未知のIDは "unknown" |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid weapon_number"} |
weapon_number が整数に変換できない |
401 / 403 / 429 |
(共通エラー) |
POST /public/me/weapons/{weapon_number}/set
武器を装備または解除します。
weapon_number=0を指定すると強制解除- 所持していない weapon_number を指定すると自動的に解除扱いになります
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
weapon_number |
integer | 装備する武器の個体番号。0 で解除 |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"equipped_weapon_number": 1,
"status": "ok",
"removed": false,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
equipped_weapon_number |
integer | 実際に装備された武器番号。解除時は 0 |
status |
string | 常に "ok" |
removed |
boolean | true のとき装備解除された |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid weapon_number"} |
weapon_number が整数に変換できない |
401 / 403 / 429 |
(共通エラー) |
ツール
POST /public/me/tool/{tool_id}/set
ツールを装備または解除します。
tool_id=0を指定すると強制解除- ツールアイテムでないIDや所持していないIDを指定すると自動的に解除扱いになります
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
tool_id |
integer | 装備するツールのアイテムID。0 で解除 |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"equipped_item_id": 1,
"status": "ok",
"removed": false,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
equipped_item_id |
integer | 実際に装備されたアイテムID。解除時は 0 |
status |
string | 常に "ok" |
removed |
boolean | true のとき装備解除された |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid item_id"} |
tool_id が整数に変換できない |
401 / 403 / 429 |
(共通エラー) |
ペット
GET /public/me/pets
所持ペットの一覧を取得します。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"pets": [
{
"pet_id": 1,
"enemy_id": 0,
"ability_id": 10,
"atk_percent": 50,
"experience": 123456,
"battle": true,
"nbt": "",
"img": "https://img.example.com/1",
"name": "ドラゴン",
"ability_name": "【激レア】レア敵出現率増加",
"skills": [
{ "id": 1, "percent": 0.1, "name": "ファイアブレス", "description": "敵に火炎ダメージを与える" }
]
}
],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
pets |
array | ペットの配列 (空の場合は []) |
pets[].pet_id |
integer | ペットの個体ID |
pets[].enemy_id |
integer | ペットの元となる敵ID |
pets[].ability_id |
integer | ペットの特性ID |
pets[].ability_name |
string | 特性名。未知のIDは "unknown" |
pets[].atk_percent |
integer | 攻撃確率 |
pets[].experience |
integer | 経験値。レベルは平方根の切り捨て |
pets[].battle |
boolean | 戦闘に参加しているかどうか。trueで戦闘参加 |
pets[].name |
string | ペットの名前 |
pets[].img |
string | ペットの画像のURL |
pets[].nbt |
string | 現状未使用。json形式で使う予定 |
pets[].skills |
array | ペットが持つスキルの配列 |
pets[].skills[].id |
integer | スキルID |
pets[].skills[].name |
string | スキル名。未知のIDは "unknown" |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス: 共通エラー のみ
GET /public/me/pets/battle
現在戦闘に参加中のペット一覧を取得します。レスポンス構造は GET /public/me/pets と同一です。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"pets": [...],
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
エラーレスポンス: 共通エラー のみ
GET /public/me/pets/{pet_id}
特定ペットの詳細情報を取得します。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
pet_id |
integer | ペットの個体ID |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"pet": {
"pet_id": 1,
"enemy_id": 0,
"ability_id": 10,
"atk_percent": 50,
"experience": 123456,
"battle": true,
"nbt": "",
"img": "https://img.example.com/1",
"name": "ドラゴン",
"ability_name": "【激レア】レア敵出現率増加",
"skills": [
{ "id": 1, "percent": 0.1, "name": "ファイアブレス", "description": "敵に火炎ダメージを与える" }
]
},
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid pet_id"} |
pet_id が整数に変換できない |
404 |
{"error": "pet not found"} |
指定したペットが存在しない、または自分のペットではない |
401 / 403 / 429 |
(共通エラー) |
POST /public/me/pets/{pet_id}/set
ペットの戦闘参加をトグルします。
- 戦闘参加中 → 解除
- 未参加 → 参加
- 戦闘スロットが上限に達している場合は参加できません (解除は可能)
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
pet_id |
integer | ペットの個体ID |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"equipped_pet_id": 1,
"status": "ok",
"removed": false,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
equipped_pet_id |
integer | 操作したペットのID |
status |
string | 常に "ok" |
removed |
boolean | true のとき戦闘参加が解除された |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid pet_id"} |
pet_id が整数に変換できない |
400 |
{"error": "pet not owned"} |
指定したペットを所持していない |
400 |
{"error": "battle pet slot full", "max_battle_pet_count": 3} |
戦闘スロットが上限に達している。max_battle_pet_count が現在の上限数 |
401 / 403 / 429 |
(共通エラー) |
POST /public/me/pets/{pet_id}/delete
ペットを削除します
- ペットが戦闘参加状態の場合は削除できません。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
pet_id |
integer | ペットの個体ID |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"deleted_pet_id": 1,
"status": "ok",
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
deleted_pet_id |
integer | 操作したペットのID |
status |
string | 常に "ok" |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid pet_id"} |
pet_id が整数に変換できない |
400 |
{"error": "pet not owned"} |
指定したペットを所持していない |
400 |
{"error": "pet is currently equipped"} |
ペットが戦闘に参加している |
401 / 403 / 429 |
(共通エラー) |
POST /public/me/pets/delete
ペットを複数削除します
- ペットが1体でも戦闘参加状態の場合は削除できません。
リクエストボディ (JSON):
{ "pet_ids": [1, 2, 3] }
| フィールド | 型 | 説明 |
|---|---|---|
pet_ids |
integer[] | 削除するペットIDの配列。 |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"deleted_pet_ids": [1, 2, 3],
"status": "ok",
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
deleted_pet_ids |
integer[] | 操作したペットのIDの配列 |
status |
string | 常に "ok" |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid pet_id"} |
pet_id が整数に変換できない |
400 |
{"error": "pet not owned"} |
指定したペットを所持していない |
400 |
{"error": "pet is currently equipped"} |
ペットが戦闘に参加している |
401 / 403 / 429 |
(共通エラー) |
POST /public/me/pets/battle/set
戦闘参加ペットを一括でセットします。
動作:
1. 既存の全戦闘参加ペットを解除
2. 指定したペットIDを順に戦闘参加登録
リクエストボディ (JSON):
{ "pet_ids": [1, 2, 3] }
| フィールド | 型 | 説明 |
|---|---|---|
pet_ids |
integer[] | セットするペットIDの配列。上限数以内の長さにすること |
成功レスポンス (200):
{
"user_id": 123456789012345678,
"equipped_pet_ids": [1, 2, 3],
"status": "ok",
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
equipped_pet_ids |
integer[] | 実際に登録されたペットIDの配列 |
status |
string | 常に "ok" |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid pet_ids"} |
pet_ids が不正 (整数に変換できないなど) |
400 |
{"error": "too many pet_ids, max is 3"} |
pet_ids の数が上限を超えている |
400 |
{"error": "pet not owned: 99"} |
指定したペットID 99 を所持していない |
401 / 403 / 429 |
(共通エラー) |
注意: エラー発生時は既存の戦闘参加状態が維持されます (ロールバックされます)。
POST /public/me/pets/battle/remove
戦闘参加中のペットをすべて解除します。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"status": "ok"
}
エラーレスポンス: 共通エラー のみ
プレイヤー
GET /public/me/exp
自分の経験値とレベルを取得します。
成功レスポンス (200):
{
"user_id": 123456789012345678,
"exp": 625,
"level": 25,
"user_info": { "user_id": 123456789012345678, "display_name": "表示名", "avatar_url": "https://...", "global_name": "グローバル名", "user_name": "ユーザー名" }
}
| フィールド | 型 | 説明 |
|---|---|---|
user_id |
integer | 自分のDiscordユーザーID |
exp |
integer | 現在の累計経験値 |
level |
integer | 現在のレベル |
user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
エラーレスポンス: 共通エラー のみ
curl 利用例
1. 認可開始 (ブラウザで開く)
# macOS
open "https://restart2api.restart-reboot.com/public/auth/discord/login"
# Windows
start "https://restart2api.restart-reboot.com/public/auth/discord/login"
2. アイテム一覧取得
curl "https://restart2api.restart-reboot.com/public/me/items" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
3. 特定アイテム所持数確認
curl "https://restart2api.restart-reboot.com/public/me/items/1001" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
4. 武器カテゴリー一覧取得
curl "https://restart2api.restart-reboot.com/public/me/weapon_categories" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
5. 武器個体の詳細取得
curl "https://restart2api.restart-reboot.com/public/me/weapons/1" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
6. 武器を装備
curl -X POST "https://restart2api.restart-reboot.com/public/me/weapons/1/set" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
7. 武器を解除
curl -X POST "https://restart2api.restart-reboot.com/public/me/weapons/0/set" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
8. ペット一括セット
curl -X POST "https://restart2api.restart-reboot.com/public/me/pets/battle/set" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"pet_ids": [1, 2, 3]}'
9. 全ペット戦闘解除
curl -X POST "https://restart2api.restart-reboot.com/public/me/pets/battle/remove" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
10. 経験値・レベル取得
curl "https://restart2api.restart-reboot.com/public/me/exp" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
11. ログアウト
curl -X POST "https://restart2api.restart-reboot.com/public/auth/logout" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
12. プレイヤーランキング (1ページ目、10件)
curl "https://restart2api.restart-reboot.com/public/ranking/player/1/10" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
13. サーバーランキング
curl "https://restart2api.restart-reboot.com/public/ranking/guild/1/10" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
14. 討伐数ランキング
curl "https://restart2api.restart-reboot.com/public/ranking/defeat/1/10" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
15. アイテムランキング (アイテムID=1001)
curl "https://restart2api.restart-reboot.com/public/ranking/item/1001/1/10" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
16. 素材ランキング (素材ID=1)
curl "https://restart2api.restart-reboot.com/public/ranking/material/1/1/10" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
17. スキルランキング (スキルID=1)
curl "https://restart2api.restart-reboot.com/public/ranking/skill/1/1/10" \
-H "Authorization: Bearer <ACCESS_TOKEN>"
ランキング
ランキング系APIはすべて認証が必要です。ページングパラメータは共通です。
共通パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
page |
integer | ページ番号 (1始まり) |
page_size |
integer | 1ページあたりの件数 (1〜100) |
共通レスポンスフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
ranking |
array | ランキングデータの配列 |
total |
integer | 全体の総件数 |
GET /public/ranking/player/{page}/{page_size}
プレイヤーを経験値順にランキング表示します。
成功レスポンス (200):
{
"ranking": [
{
"user_id": 123456789012345678,
"user_info": { "name": "プレイヤー名", "avatar": "https://..." },
"exp": 100000,
"level": 316,
"ranking": 1
}
],
"total": 250
}
| フィールド | 型 | 説明 |
|---|---|---|
ranking[].user_id |
integer | DiscordユーザーID |
ranking[].user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
ranking[].exp |
integer | 累計経験値 |
ranking[].level |
integer | レベル |
ranking[].ranking |
integer | 順位 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid page number"} |
page が整数に変換できない |
400 |
{"error": "invalid page_size"} |
page_size が整数でない、または1〜100の範囲外 |
401 / 403 / 429 |
(共通エラー) |
GET /public/ranking/guild/{page}/{page_size}
サーバー (ギルド) をレベル順にランキング表示します。
成功レスポンス (200):
{
"ranking": [
{
"guild_id": 987654321098765432,
"guild_name": "サーバー名",
"level": 50,
"ranking": 1
}
],
"total": 30
}
| フィールド | 型 | 説明 |
|---|---|---|
ranking[].guild_id |
integer | DiscordサーバーID |
ranking[].guild_name |
string | サーバー名。BOTが参加していない場合は "unknown" |
ranking[].level |
integer | サーバーレベル |
ranking[].ranking |
integer | 順位 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid page number"} |
page が整数に変換できない |
400 |
{"error": "invalid page_size"} |
page_size が整数でない、または1〜100の範囲外 |
401 / 403 / 429 |
(共通エラー) |
GET /public/ranking/defeat/{page}/{page_size}
モンスター討伐数順にプレイヤーをランキング表示します。
成功レスポンス (200):
{
"ranking": [
{
"user_id": 123456789012345678,
"user_info": { "name": "プレイヤー名", "avatar": "https://..." },
"defeats": 9999,
"ranking": 1
}
],
"total": 250
}
| フィールド | 型 | 説明 |
|---|---|---|
ranking[].user_id |
integer | DiscordユーザーID |
ranking[].user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
ranking[].defeats |
integer | 累計討伐数 |
ranking[].ranking |
integer | 順位 |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid page number"} |
page が整数に変換できない |
400 |
{"error": "invalid page_size"} |
page_size が整数でない、または1〜100の範囲外 |
401 / 403 / 429 |
(共通エラー) |
GET /public/ranking/item/{item_id}/{page}/{page_size}
特定アイテムの所持数順にプレイヤーをランキング表示します。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
item_id |
integer | ランキング対象のアイテムID |
page |
integer | ページ番号 (1始まり) |
page_size |
integer | 1ページあたりの件数 (1〜100) |
成功レスポンス (200):
{
"ranking": [
{
"user_id": 123456789012345678,
"user_info": { "name": "プレイヤー名", "avatar": "https://..." },
"count": 999,
"ranking": 1
}
],
"total": 100,
"item_id": 1001,
"item_name": "透明のポーション"
}
| フィールド | 型 | 説明 |
|---|---|---|
ranking[].user_id |
integer | DiscordユーザーID |
ranking[].user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
ranking[].count |
integer | 対象アイテムの所持数 |
ranking[].ranking |
integer | 順位 |
item_id |
integer | ランキング対象のアイテムID |
item_name |
string | アイテム名。未知のIDは "unknown" |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid page number"} |
page が整数に変換できない |
400 |
{"error": "invalid page_size"} |
page_size が整数でない、または1〜100の範囲外 |
400 |
{"error": "invalid item_id"} |
item_id が整数でない、またはゲームに存在しないID |
401 / 403 / 429 |
(共通エラー) |
GET /public/ranking/material/{material_id}/{page}/{page_size}
特定素材の所持数順にプレイヤーをランキング表示します。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
material_id |
integer | ランキング対象の素材ID |
page |
integer | ページ番号 (1始まり) |
page_size |
integer | 1ページあたりの件数 (1〜100) |
成功レスポンス (200):
{
"ranking": [
{
"user_id": 123456789012345678,
"user_info": { "name": "プレイヤー名", "avatar": "https://..." },
"count": 9999,
"ranking": 1
}
],
"total": 100,
"material_id": 1,
"material_name": "木材"
}
| フィールド | 型 | 説明 |
|---|---|---|
ranking[].user_id |
integer | DiscordユーザーID |
ranking[].user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
ranking[].count |
integer | 対象素材の所持数 |
ranking[].ranking |
integer | 順位 |
material_id |
integer | ランキング対象の素材ID |
material_name |
string | 素材名。未知のIDは "unknown" |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid page number"} |
page が整数に変換できない |
400 |
{"error": "invalid page_size"} |
page_size が整数でない、または1〜100の範囲外 |
400 |
{"error": "invalid material_id"} |
material_id が整数でない、またはゲームに存在しないID |
401 / 403 / 429 |
(共通エラー) |
GET /public/ranking/skill/{skill_id}/{page}/{page_size}
特定スキルの所持数順にプレイヤーをランキング表示します。
パスパラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
skill_id |
integer | ランキング対象のスキルID |
page |
integer | ページ番号 (1始まり) |
page_size |
integer | 1ページあたりの件数 (1〜100) |
成功レスポンス (200):
{
"ranking": [
{
"user_id": 123456789012345678,
"user_info": { "name": "プレイヤー名", "avatar": "https://..." },
"count": 10,
"ranking": 1
}
],
"total": 50,
"skill_id": 1,
"skill_name": "ダイアゴナル"
}
| フィールド | 型 | 説明 |
|---|---|---|
ranking[].user_id |
integer | DiscordユーザーID |
ranking[].user_info |
object | ユーザー情報。詳細は user_info オブジェクト を参照 |
ranking[].count |
integer | 対象スキルの所持数 |
ranking[].ranking |
integer | 順位 |
skill_id |
integer | ランキング対象のスキルID |
skill_name |
string | スキル名。未知のIDは "unknown" |
エラーレスポンス:
| ステータス | レスポンス | 原因 |
|---|---|---|
400 |
{"error": "invalid page number"} |
page が整数に変換できない |
400 |
{"error": "invalid page_size"} |
page_size が整数でない、または1〜100の範囲外 |
400 |
{"error": "invalid skill_id"} |
skill_id が整数でない、またはゲームに存在しないID |
401 / 403 / 429 |
(共通エラー) |
エラーコード早見表
| HTTPステータス | 意味 | 主な error 値 |
|---|---|---|
400 |
リクエスト不正 | missing code or state / invalid state / state expired / invalid item_id / pet not owned / battle pet slot full など |
401 |
認証失敗 | missing bearer token / invalid bearer token / token not found / token expired |
403 |
権限なし | booster required |
404 |
見つからない | pet not found |
429 |
レート制限超過 | rate limit exceeded |
500 |
サーバー設定ミス | CLIENT_ID is not configured / ...is not configured |
502 |
Discord API通信失敗 | discord api request failed |