Skip to content

Steam Workshop API

プレフィックス: /api/steam/workshop

同梱 Workshop UI の integration surface です。local staging、Steam UGC discovery/download/publish、character sync、unsubscribe cleanup、任意の reference voice packaging を扱います。

First-party・local-only

多くの request/response field は UI workflow state で、versioned third-party schema ではありません。一部 route は local path、Steam subscription、character data を変更します。loopback のみで運用してください。Steamworks 未初期化時、Steam 依存操作は 503 です。

Config と sandbox file helper

メソッドとパス用途
GET /api/steam/workshop/configdefault_workshop_folderuser_mod_folder、auto-create 設定を取得。
POST /api/steam/workshop/config対応 field を merge し、有効なら folder を作成。
GET /api/steam/workshop/read-fileWorkshop root 内の必須 query path を read。text は直接、既知 binary は base64。上限 5 MiB。
GET /api/steam/workshop/list-chara-files必須 query directory 内の top-level *.chara.json を列挙。
GET /api/steam/workshop/list-audio-files必須 directory 内の top-level .mp3/.wav を列挙。

Path containment が traversal を拒否します。missing path は 404、oversize read は 413、その他 read failure は 500

Steam item discovery・download

メソッドとパス用途
GET /api/steam/workshop/statusSteamworks 初期化状態。
GET /api/steam/workshop/subscribed-itemssubscribed UGC metadata を cache/refresh して返します。
GET /api/steam/workshop/item/{item_id}1 item の metadata。
GET /api/steam/workshop/item/{item_id}/pathinstalled item の local path。
POST /api/steam/workshop/item/{item_id}/downloaddownload trigger。任意 body: high_prioritywaittimeout(1–600 秒)。
GET /api/steam/workshop/item/{item_id}/download-statusstate、byte progress、installed path を poll。

非数値 ID は 400、未 subscribe download は 409、Steam reject は 502 の場合があります。wait: true timeout は HTTP 202 と現在進捗を返し、poll 継続可能。既に install 済みなら即時成功です。

Staging と publish

POST /api/steam/workshop/prepare-upload

一時 WorkshopExport/item_* を作り、character card と Live2D/VRM/MMD model を copy。UI 必須は charaDatamodelNamemodelType の既定は live2d。任意 fileNamecharacter_card_name。既 upload metadata、未対応 type、危険 path、missing asset は拒否します。

Upload・cleanup helper

メソッドとパス用途
POST /api/steam/workshop/upload-preview-imagemultipart JPEG/PNG file を upload。任意 content_folderfile_path を返します。
GET /api/steam/workshop/check-upload-statusquery item_path の staging/upload 状態を確認。
POST /api/steam/workshop/cleanup-temp-folderbody temp_folderWorkshopExport 内に解決される場合のみ削除。

POST /api/steam/workshop/publish

prepared folder を publish。JSON 必須 titlecontent_folder、整数 visibility。任意 descriptionpreview_imagetagschange_notecharacter_card_namecontent_folder は Workshop root 内必須。Steam callback は非同期 native integration で、進捗/失敗は success envelope と HTTP status で返します。

Platform boundary

macOS arm64 は現 Steamworks binding に callback crash risk があるため native publish を明示的に拒否します。

Character metadata・sync

メソッドとパス用途
GET /api/steam/workshop/meta/{character_name}card の local .workshop_meta.json snapshot と upload 状態。
POST /api/steam/workshop/sync-characterssubscribed/installed item を scan して card を sync。
POST /api/steam/workshop/sync-character/{item_id}1 item の card を sync。
POST /api/steam/workshop/unsubscribebody item_id を unsubscribe し、関連 character/asset を guarded cleanup。

Sync は skip/conflict、missing install、storage write fence を JSON で報告する場合があります。Unsubscribe は origin metadata と保守的 disk check を使い、Workshop folder に同名 card があるだけで local character を削除しません。

Reference voice packaging

メソッドとパス用途
POST /api/steam/workshop/upload-reference-audiomultipart fileWorkshopExportcontent_folder。MP3/WAV を受け voice_manifest.json を作成。任意 prefixdisplay_nameref_languageprovider_hint
POST /api/steam/workshop/remove-reference-audiobody content_folder から sample と manifest を削除。
GET /api/steam/workshop/voice-reference/{item_id}installed subscribed item の normalized manifest。ない場合 available: false
GET /api/steam/workshop/voice-reference/{item_id}/audio検証済み reference audio を stream。

Reference material を package するだけで、local TTS voice の clone/register は行いません。

Content folder の排他

publish は upload 完了まで content folder 全体を Steam に渡します。その間は upload-reference-audioremove-reference-audiocleanup-temp-folder が待たずに 409 を返し、Steam が使用中の bytes を変更しません。逆方向も同じで、reference audio の書き込み中は publish409 を返します。

実装で確認した route 一覧

text
GET  /api/steam/workshop/config
POST /api/steam/workshop/config
GET  /api/steam/workshop/read-file
GET  /api/steam/workshop/list-chara-files
GET  /api/steam/workshop/list-audio-files
GET  /api/steam/workshop/status
POST /api/steam/workshop/item/{item_id}/download
GET  /api/steam/workshop/item/{item_id}/download-status
GET  /api/steam/workshop/item/{item_id}/path
GET  /api/steam/workshop/item/{item_id}
GET  /api/steam/workshop/meta/{character_name}
POST /api/steam/workshop/upload-preview-image
GET  /api/steam/workshop/check-upload-status
POST /api/steam/workshop/prepare-upload
POST /api/steam/workshop/cleanup-temp-folder
POST /api/steam/workshop/publish
POST /api/steam/workshop/sync-characters
POST /api/steam/workshop/sync-character/{item_id}
GET  /api/steam/workshop/subscribed-items
POST /api/steam/workshop/unsubscribe
POST /api/steam/workshop/upload-reference-audio
POST /api/steam/workshop/remove-reference-audio
GET  /api/steam/workshop/voice-reference/{item_id}
GET  /api/steam/workshop/voice-reference/{item_id}/audio