API リファレンス
作者の手元・CI・エディタ拡張から、ゲームの作成と設定変更・サムネイルとビルドのアップロード・ランキングの宣言・アナリティクスの取得を行う HTTP API です。
ゲームの中から呼ぶ API(ランキングへの投稿・公開プレイヤー状態・マルチプレイ)は SDK ガイド を見てください。
1. はじめに
API はすべて https://gamerush.jp/api/ の下にあります。本文は JSON で送り、応答も JSON で返ります。成功はすべて 200 です。
認証は、Studio の API トークン で発行したトークンを Authorization: Bearer に載せるだけです。発行のしかた・権限の選び方・置き場所の注意は SDK ガイドの API トークン にあります。
export GRUSH_TOKEN="grush_pat_..."
curl "https://gamerush.jp/api/games" \
-H "Authorization: Bearer $GRUSH_TOKEN"トークンをゲームのビルドへ入れないでください。ここにある API は、作者の手元・CI・エディタ拡張から呼ぶためのものです。
- トークンで呼べるのは、このページに載っている API だけです。アカウントの操作・コメント・フォローなどは、トークンでは
401になります。 - トークンから新しいトークンは発行できません。
- 運営の管理権限はトークンには乗りません。管理者が発行したトークンでも、触れるのは本人がオーナーか共同編集者のゲームだけです。
エラーの形
失敗すると、error(英語の説明文)か code(機械で読める識別子)と params のどちらかを持つ JSON が返ります。details が付くこともあります。
{ "error": "API token is missing the games:write scope." }
{ "code": "build.tooManyFiles", "params": { "limit": 2000 } }| HTTP | よくある原因 |
|---|---|
| 400 | リクエストの形が違う(必須の項目が無い、ビルドのファイル一覧の形が違う など) |
| 401 | トークンが無い・形が違う・期限切れ・失効済み |
| 403 | トークンに必要な権限が無い。規約や素材の権利への同意が無い |
| 404 | ゲームが無い。トークンの対象ゲームに入っていない。自分がオーナーでも共同編集者でもない |
| 409 | 状態がぶつかった(審査の途中で変わった、同じ key が既にある など) |
| 422 | アップロードしたビルドの中身の検査で弾かれた |
対象ゲームを絞ったトークンを他のゲームへ向けたときは、存在を漏らさないために 403 ではなく 404 になります。
2. ゲーム
| API | 権限 | 内容 |
|---|---|---|
GET /api/games | games:read | 自分のゲームと共同編集中のゲームの一覧 |
GET /api/games/:id | games:read | ゲーム1本と最新ビルド |
POST /api/games | games:create | ゲームの新規作成 |
PATCH /api/games/:id | games:write | タイトル・説明・元 URL・サムネイル・実況ポリシー・公開設定の変更 |
GET の応答は { games: [...] } / { game } です。各ゲームには id・title・visibility・review_status・requested_visibility・streaming_policy・thumb_url・play_count などと、最新ビルドの latestBuild が入ります。
ゲームを作る
curl -X POST "https://gamerush.jp/api/games" \
-H "Authorization: Bearer $GRUSH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "ねこジャンプ",
"description": "タップで跳ぶだけのショートゲーム",
"visibility": "public",
"streamingPolicy": "allowed",
"acceptTerms": true,
"confirmAssetRights": true
}'| フィールド | 内容 |
|---|---|
title | 必須。120 文字まで。改行は空白になる |
description | 2000 文字まで |
visibility | public / unlisted / private。トークンで作ったゲームは必ず private で始まり、public / unlisted を指定した分は最初のビルドが完了した時点で審査に積まれる |
sourceUrl | 元の配布ページなど。http / https で 500 文字まで |
streamingPolicy | 実況ポリシー。下の表を参照 |
streamingPolicyNote | conditional のときだけ保存される条件の説明。500 文字まで |
acceptTerms | 必須。利用規約 と ゲーム掲載ポリシー に同意するなら true |
confirmAssetRights | 必須。画像・音・コードなどの素材をすべて自分で作ったか、使う権利を持っているなら true |
thumbnail | サムネイルを同時に上げるとき。サムネイル を参照 |
応答は { game, mediaUploads } です。作成には冪等キーが無いので、失敗しても機械的に再試行しないでください。応答が失われた場合は GET /api/games で作られたかを確かめてからやり直します。
対象ゲームを絞ったトークンではゲームを作れません(まだ無いゲームは対象に入れられないため)。
設定を変える
PATCH は送ったフィールドだけを変えます。Studio の保存ボタンと同じ処理を通るので、審査やホールドの扱いも画面と同じです。
curl -X PATCH "https://gamerush.jp/api/games/$GAME_ID" \
-H "Authorization: Bearer $GRUSH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"streamingPolicy": "conditional",
"streamingPolicyNote": "収益化した配信ではクレジットを表示してください",
"visibility": "unlisted"
}'| streamingPolicy の値 | 意味 |
|---|---|
allowed | 実況・動画投稿を許可する |
conditional | 条件付きで許可する(条件は streamingPolicyNote) |
prohibited | 実況・動画投稿を許可しない |
unspecified | 未設定(既定) |
実況ポリシーの意味と、プレイヤーにどう見えるかは ゲーム実況ポリシー にあります。sourceUrl に null か空文字を送ると消えます。
streamingPolicy に表に無い値("Allowed" のような打ち間違いを含む)を送ると、エラーにはならず unspecified として保存されます。title / description / streamingPolicyNote は上限を超えた分が切り詰められます。応答の game で保存された値を確かめてください。
公開設定と審査
privateへの変更はすぐに反映され、審査待ちがあれば取り消されます。public/unlistedへの変更は、最新ビルドが審査済みならすぐに反映されます。そうでなければvisibilityはprivateのままrequested_visibilityに希望が入り、review_statusがpendingになります。- ビルドがまだ無いゲームは公開できません(
409review.buildRequired)。 - 素材の権利をまだ確認していないゲームを公開へ変えるときは、
confirmAssetRights: trueを一緒に送ります。 - ホールド中のゲームは公開設定を変えられません(
403hold.locked)。 - 変更の途中で審査の状態が変わったときは
409review.stateChangedになります。最新の状態を読んでからやり直してください。
トークンでは審査を飛ばせません。管理者のトークンでも同じです。
3. サムネイル
サムネイルは2段で上げます。まず POST /api/games か PATCH /api/games/:id にファイルの名前と大きさだけを送り、返ってきた mediaUploads の url へ画像そのものを PUT します。確定の呼び出しはありません。
SIZE=$(wc -c < thumb.png)
curl -X PATCH "https://gamerush.jp/api/games/$GAME_ID" \
-H "Authorization: Bearer $GRUSH_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"thumbnail\":{\"fileName\":\"thumb.png\",\"size\":$SIZE,\"contentType\":\"image/png\"}}" \
> patch.json
UPLOAD_URL=$(jq -r '.mediaUploads[] | select(.kind == "thumbnail") | .url' patch.json)
curl -X PUT "$UPLOAD_URL" --data-binary @thumb.png| フィールド | kind | 受け付ける形 |
|---|---|---|
thumbnail | thumbnail | png / jpg / webp / gif、1MB まで。これが無いと他の3つも無視される |
thumbnailSmall | thumbnail-small | 長辺 512px の webp / jpg、1MB まで。GIF のときは無視 |
thumbnailLarge | thumbnail-large | 長辺 1920px の webp / jpg、1MB まで。GIF のときは無視 |
thumbnailOg | thumbnail-og | SNS の共有カード用の jpg、1MB まで。GIF のときだけ使う |
- 各フィールドは
{ fileName, size, contentType }です。形式はfileNameの拡張子で決まります。 urlの期限は 1 時間です。切れたら同じPATCHをやり直して新しいurlを取ります。- ゲームのサムネイルの URL は
PATCHの時点で新しいものへ切り替わります。PUTを終えるまでは画像が出ないので、続けて上げてください。
4. ビルドのアップロード
ビルドは3段で上げます。権限はどれも builds:write です。Unity なら Editor 拡張 が同じ手順を持っているので、自分で書く必要はありません。
| 段 | API | 内容 |
|---|---|---|
| 1 | POST /api/games/:id/builds | ファイルの一覧を送り、ファイルごとの送り先を受け取る |
| 2 | PUT <uploadUrls[].url> | 各ファイルの中身をそのまま送る |
| 3 | POST /api/builds/:buildId/complete | 中身を検査して、ゲームの最新ビルドにする |
{
"engine": "godot",
"files": [
{ "path": "index.html", "size": 5120 },
{ "path": "index.js", "size": 301224 },
{ "path": "index.wasm", "size": 35651584 },
{ "path": "index.pck", "size": 2097152 }
]
}curl -X POST "https://gamerush.jp/api/games/$GAME_ID/builds" \
-H "Authorization: Bearer $GRUSH_TOKEN" \
-H "Content-Type: application/json" \
-d @manifest.json > build.json
jq -c '.uploadUrls[]' build.json | while read -r ticket; do
path=$(echo "$ticket" | jq -r '.path')
url=$(echo "$ticket" | jq -r '.url')
curl -X PUT "$url" -H "If-None-Match: *" --data-binary @"build/$path"
done
BUILD_ID=$(jq -r '.build.id' build.json)
curl -X POST "https://gamerush.jp/api/builds/$BUILD_ID/complete" \
-H "Authorization: Bearer $GRUSH_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'ファイルの一覧で決まること
engineはunity/godot/phaser/webのどれかです。- ルートに
index.htmlが要ります。HTML は圧縮せずに送ってください。 - ファイル数は 2000 まで、合計は 300MB までです。
sizeはそのまま送るバイト数を書きます。 - 使えるファイルの種類は Studio からのアップロードと同じです。ソースマップ(
.js.map)は含めないでください。 - Unity の
Build/x.wasm.brのように、書き出した時点で.br/.gzが付いたファイルはその名前のまま送ります。自分で gzip したファイルを送るときは、元の名前のpathに"encoding": "gzip"を添え、sizeは圧縮後の大きさにします。
Studio の画面から Unity を選んで上げたときは、GameRush がプレイヤーを組み立ててローディングバーと先読みを付けます。API から上げたビルドは、送った index.html がそのまま使われます。
ファイルを送る
uploadUrls[].headersに入っているヘッダーは、そのまま付けて送ってください(いまはIf-None-Match: *です)。- 同じファイルは1度しか書けません。2度目は
412になるので、送信済みとして扱って構いません。途中で止まったときは、残りのファイルだけ送り直せます。 urlの期限は 1 時間です。
完了させる
complete は、送ったファイルの大きさ・中身の形式・HTML の内容を検査してから、ゲームの最新ビルドに切り替えます。
| 応答 | 意味 | 次にすること |
|---|---|---|
| 200 | ビルドが ready になり、ゲームの最新ビルドになった | — |
409(details.missing 付き) | 送っていないファイルがある。このビルドは失敗扱いになる | ビルドの作成からやり直す |
409(details なし、ゲームの状態が変わった) | アップロード中に、ほかの操作でゲームの状態が変わった | 同じ complete をもう一度呼ぶ |
409(details なし、ビルドが失敗済み・破棄済み) | 前の complete で既に失敗したか、ビルドが破棄された | ビルドの作成からやり直す |
| 422 | 中身の検査で弾かれた(params.path に原因のファイル)。ビルドは消える | ファイルを直してから作成し直す |
| 503 | 一時的に処理できなかった | 同じ complete をもう一度呼ぶ |
公開中(public / unlisted)のゲームに審査前のビルドを完了させると、ゲームはいったん private に戻り、元の公開設定で審査に積まれます。
ビルドの作成には冪等キーが無いので、POST /api/games/:id/builds を機械的に再試行しないでください。再試行するたびに別のビルドができます。
5. ランキングの定義
ゲームから投稿するランキングの枠を宣言します。ゲーム側からの投稿と取得は SDK の役目で、ここにあるのは作者の手元から枠を管理する API です(SDK ガイドのランキング)。
| API | 権限 | 内容 |
|---|---|---|
GET /api/games/:id/leaderboards | leaderboards:read | 定義の一覧(停止中も含む) |
PUT /api/games/:id/leaderboards/:key | leaderboards:write | key での冪等な作成・更新。スクリプトから流すならこれ |
POST /api/games/:id/leaderboards | leaderboards:write | 作成。同じ key があれば 409 |
PATCH /api/games/:id/leaderboards/:leaderboardId | leaderboards:write | 送ったフィールドだけ更新 |
DELETE /api/games/:id/leaderboards/:leaderboardId | leaderboards:write | 削除 |
GET /api/games/:id/leaderboards/anomalies | leaderboards:read | 不審な投稿として印が付いたエントリの一覧 |
| フィールド | 値 |
|---|---|
key | 英数字と . _ : - で 64 文字まで |
title | 60 文字まで |
sort | desc(大きいほど上)/ asc |
valueType | int / float / duration_ms |
aggregation | best / last / sum |
period | all_time / daily / weekly / monthly |
minValue / maxValue | 受け付ける値域。両方そろえて指定する |
enabled | false で投稿を止める(既定 true) |
1ゲームあたり 20 枠までです。投稿が1件でもある枠では sort / valueType / aggregation / period を変えられません(409)。コマンドの例と注意は SDK ガイドの API トークン にあります。
6. アナリティクス
GET /api/analytics/games/:id で、Studio のアナリティクス画面と同じ数字をゲーム1本ぶん取れます。権限は analytics:read です。
curl "https://gamerush.jp/api/analytics/games/$GAME_ID?period=7d" \
-H "Authorization: Bearer $GRUSH_TOKEN"period は 24h / 7d / 28d(既定)/ 90d / all です。
| フィールド | 内容 |
|---|---|
game | validPlays(有効プレイ数)・uniquePlayers・totalSessions・avgDurationSec・opens・skips・likeCount・commentCount・retention(翌日の再訪率と 7 日以内の再訪率) |
series | bucket ごとの plays / sessions / durationSec。期間に応じて1時間・6時間・1日で区切る |
performance | 端末で測ったロード時間(平均・p95・途中離脱率)とフレームレート。標本が少ないうちは null |
period / generatedAt | 集計の期間と、集計した時刻 |
有効プレイは、遊び始めてから 10 秒を超えたプレイだけを数えます。ロード時間の数字は ゲームの最適化ガイド の効き目を確かめるのに使えます。
7. 自分のツールからトークンを取る
作者に Studio でトークンを発行して貼ってもらう代わりに、ブラウザで承認してもらって自分のツールがトークンを受け取る形も取れます(RFC 8252 のループバック + PKCE)。Unity の Editor 拡張はこの形です。
- ツールが手元で
http://127.0.0.1:<port>の HTTP サーバを立て、code_verifier(43〜128 文字のランダムな文字列)を作る - ブラウザで下の URL を開く。作者がログインして内容を確かめ、承認ボタンを押す
- ブラウザが
redirect_uri?code=…&state=…へ戻ってくる。stateが送ったものと同じか確かめる exchangeにcodeとcode_verifierを送り、トークンを受け取る
https://gamerush.jp/studio/authorize
?redirect_uri=http://127.0.0.1:53682
&code_challenge=<base64url(sha256(code_verifier))>
&code_challenge_method=S256
&client_name=My%20Build%20Tool
&scopes=games:read,builds:write
&state=<ランダムな値>curl -X POST "https://gamerush.jp/api/api-token-authorizations/exchange" \
-H "Content-Type: application/json" \
-d '{"code":"<戻ってきた code>","codeVerifier":"<code_verifier>","redirectUri":"http://127.0.0.1:53682"}'redirect_uriはhttp://127.0.0.1:<port>/http://localhost:<port>/http://[::1]:<port>だけです。クエリもフラグメントも付けられません。code_challenge_methodはS256だけです。scopesはカンマ区切りです。game_idsにゲーム ID をカンマ区切りで渡すと、トークンの対象をそのゲームに絞れます。games:createとは一緒に使えません。codeはワンタイムで 5 分です。code_verifierを間違えたときは承認からやり直してください。- 応答は
{ token, secret }で、secretがトークンの本体です。有効期限は 90 日です。有効なトークンが 20 本あると409になります。 client_nameは承認画面と Studio のトークン一覧に出ます。