API リファレンス

開発者向けページ2026年9月27日 公開

作者の手元・CI・エディタ拡張から、ゲームの作成と設定変更・サムネイルとビルドのアップロード・ランキングの宣言・アナリティクスの取得を行う HTTP API です。

ゲームの中から呼ぶ API(ランキングへの投稿・公開プレイヤー状態・マルチプレイ)は SDK ガイド を見てください。

1. はじめに

API はすべて https://gamerush.jp/api/ の下にあります。本文は JSON で送り、応答も JSON で返ります。成功はすべて 200 です。

認証は、Studio の API トークン で発行したトークンを Authorization: Bearer に載せるだけです。発行のしかた・権限の選び方・置き場所の注意は SDK ガイドの API トークン にあります。

Shell
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 が付くこともあります。

JSON
{ "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/gamesgames:read自分のゲームと共同編集中のゲームの一覧
GET /api/games/:idgames:readゲーム1本と最新ビルド
POST /api/gamesgames:createゲームの新規作成
PATCH /api/games/:idgames:writeタイトル・説明・元 URL・サムネイル・実況ポリシー・公開設定の変更

GET の応答は { games: [...] } / { game } です。各ゲームには id・title・visibility・review_status・requested_visibility・streaming_policy・thumb_url・play_count などと、最新ビルドの latestBuild が入ります。

ゲームを作る

Shell
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 文字まで。改行は空白になる
description2000 文字まで
visibilitypublic / unlisted / private。トークンで作ったゲームは必ず private で始まり、public / unlisted を指定した分は最初のビルドが完了した時点で審査に積まれる
sourceUrl元の配布ページなど。http / https で 500 文字まで
streamingPolicy実況ポリシー。下の表を参照
streamingPolicyNoteconditional のときだけ保存される条件の説明。500 文字まで
acceptTerms必須。利用規約 と ゲーム掲載ポリシー に同意するなら true
confirmAssetRights必須。画像・音・コードなどの素材をすべて自分で作ったか、使う権利を持っているなら true
thumbnailサムネイルを同時に上げるとき。サムネイル を参照

応答は { game, mediaUploads } です。作成には冪等キーが無いので、失敗しても機械的に再試行しないでください。応答が失われた場合は GET /api/games で作られたかを確かめてからやり直します。

対象ゲームを絞ったトークンではゲームを作れません(まだ無いゲームは対象に入れられないため)。

設定を変える

PATCH は送ったフィールドだけを変えます。Studio の保存ボタンと同じ処理を通るので、審査やホールドの扱いも画面と同じです。

Shell
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 になります。
  • ビルドがまだ無いゲームは公開できません(409 review.buildRequired)。
  • 素材の権利をまだ確認していないゲームを公開へ変えるときは、confirmAssetRights: true を一緒に送ります。
  • ホールド中のゲームは公開設定を変えられません(403 hold.locked)。
  • 変更の途中で審査の状態が変わったときは 409 review.stateChanged になります。最新の状態を読んでからやり直してください。

トークンでは審査を飛ばせません。管理者のトークンでも同じです。

3. サムネイル

サムネイルは2段で上げます。まず POST /api/games か PATCH /api/games/:id にファイルの名前と大きさだけを送り、返ってきた mediaUploads の url へ画像そのものを PUT します。確定の呼び出しはありません。

Shell
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受け付ける形
thumbnailthumbnailpng / jpg / webp / gif、1MB まで。これが無いと他の3つも無視される
thumbnailSmallthumbnail-small長辺 512px の webp / jpg、1MB まで。GIF のときは無視
thumbnailLargethumbnail-large長辺 1920px の webp / jpg、1MB まで。GIF のときは無視
thumbnailOgthumbnail-ogSNS の共有カード用の jpg、1MB まで。GIF のときだけ使う
  • 各フィールドは { fileName, size, contentType } です。形式は fileName の拡張子で決まります。
  • url の期限は 1 時間です。切れたら同じ PATCH をやり直して新しい url を取ります。
  • ゲームのサムネイルの URL は PATCH の時点で新しいものへ切り替わります。PUT を終えるまでは画像が出ないので、続けて上げてください。

4. ビルドのアップロード

ビルドは3段で上げます。権限はどれも builds:write です。Unity なら Editor 拡張 が同じ手順を持っているので、自分で書く必要はありません。

段API内容
1POST /api/games/:id/buildsファイルの一覧を送り、ファイルごとの送り先を受け取る
2PUT <uploadUrls[].url>各ファイルの中身をそのまま送る
3POST /api/builds/:buildId/complete中身を検査して、ゲームの最新ビルドにする
JSON
{
  "engine": "godot",
  "files": [
    { "path": "index.html", "size": 5120 },
    { "path": "index.js", "size": 301224 },
    { "path": "index.wasm", "size": 35651584 },
    { "path": "index.pck", "size": 2097152 }
  ]
}
Shell
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/leaderboardsleaderboards:read定義の一覧(停止中も含む)
PUT /api/games/:id/leaderboards/:keyleaderboards:writekey での冪等な作成・更新。スクリプトから流すならこれ
POST /api/games/:id/leaderboardsleaderboards:write作成。同じ key があれば 409
PATCH /api/games/:id/leaderboards/:leaderboardIdleaderboards:write送ったフィールドだけ更新
DELETE /api/games/:id/leaderboards/:leaderboardIdleaderboards:write削除
GET /api/games/:id/leaderboards/anomaliesleaderboards:read不審な投稿として印が付いたエントリの一覧
フィールド値
key英数字と . _ : - で 64 文字まで
title60 文字まで
sortdesc(大きいほど上)/ asc
valueTypeint / float / duration_ms
aggregationbest / last / sum
periodall_time / daily / weekly / monthly
minValue / maxValue受け付ける値域。両方そろえて指定する
enabledfalse で投稿を止める(既定 true)

1ゲームあたり 20 枠までです。投稿が1件でもある枠では sort / valueType / aggregation / period を変えられません(409)。コマンドの例と注意は SDK ガイドの API トークン にあります。

6. アナリティクス

GET /api/analytics/games/:id で、Studio のアナリティクス画面と同じ数字をゲーム1本ぶん取れます。権限は analytics:read です。

Shell
curl "https://gamerush.jp/api/analytics/games/$GAME_ID?period=7d" \
  -H "Authorization: Bearer $GRUSH_TOKEN"

period は 24h / 7d / 28d(既定)/ 90d / all です。

フィールド内容
gamevalidPlays(有効プレイ数)・uniquePlayers・totalSessions・avgDurationSec・opens・skips・likeCount・commentCount・retention(翌日の再訪率と 7 日以内の再訪率)
seriesbucket ごとの 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 を送り、トークンを受け取る
Shell
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=<ランダムな値>
Shell
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 のトークン一覧に出ます。