Control API リファレンス
SimpliGen がマシンで公開するローカル HTTP API。カスタム統合の構築と、ヘッドレス生成の実行に対応しています。
SimpliGen はアプリがオープンしている間、マシン上で小規模な HTTP Control API を実行します。これは MCP サーバー が通信する同じ API であり、直接公開されているため、アプリを最小化してトレイに格納した状態でも、独自のスクリプト、サービス、またはエージェントから SimpliGen を制御できます。
MCP と Control API の違い
AI エージェント (Claude、Codex など) に SimpliGen を使用させたいだけの場合は、代わりに MCP サーバー を設定してください。このサーバーは API をラップしています。任意の言語でカスタム統合を記述している場合は、Control API を直接使用してください。
ベース URL と検出
サーバーは ループバックのみ にバインドされ、デフォルトは以下です:
http://127.0.0.1:48199そのポートが使用されている場合、SimpliGen は OS が割り当てたポートにフォールバックします。現在のポート (と API バージョン) は、常にアプリのユーザーデータディレクトリの検出ファイルに書き込まれます:
# Windows
%APPDATA%\simpligen\agent-api.json
# macOS
~/Library/Application Support/simpligen/agent-api.json
# Linux
~/.config/simpligen/agent-api.json{ "port": 48199, "version": 1 }48199 をハードコードするのではなく、このファイルを読んで有効なポートを検出してください。
要件
Control API はアプリがオープンしており、マシンが エージェントアクセスを許可 されている (ライセンスの一部です) 場合にのみ実行されます。Host ヘッダーがループバックエイリアスの場合のみリクエストがサーブされます。それ以外の場合は 403 forbidden_host が返されます (DNS リバインディング対策)。
認証
GET /health を除くすべてのエンドポイントには、Authorization ヘッダーの ペアリングトークン が必要です:
Authorization: Bearer sg-agent-xxxxxxxx...トークンをアプリの 設定 → エージェントの接続 で作成してください (エージェントの接続 を参照)。生のトークンは 1 回のみ 表示されます。ハッシュのみが保存されます。各トークンはクラウド生成用の使用額上限をオプションで持つことができます。アプリでトークンを取り消すと、即座に有効になります。
トークンが見つからないか無効な場合は 401 unauthorized が返されます。
規約
- リクエスト: JSON ボディ (
Content-Type: application/json)、最大 50 MB。 - レスポンス: 常に JSON。
- エラー: 2xx 以外のレスポンスは
{ "errorCode": "...", "message": "..." }の形式です。 - ID: プリセットは
presetId(+オプションのpackId) でアドレス指定されます。ジョブはjobIdでアドレス指定されます。
最小限の認証呼び出し:
TOKEN="sg-agent-..."
curl -s http://127.0.0.1:48199/status -H "Authorization: Bearer $TOKEN"ヘルスチェック
GET /health
稼働確認プローブ。認証不要。
{ "ok": true, "name": "simpligen", "version": 1 }機能
GET /capabilities
生成できるすべてのプリセットを一覧表示します。(preset, mediaType) ごとに 1 エントリ、入力、オプション、ローカル準備状況、クラウド適格性/コスト付き。
{
"capabilities": [
{
"packId": "local-core-pack",
"presetId": "z-image-turbo",
"mediaType": "image",
"name": "Z-Image Turbo",
"description": "Ultra-fast, high-quality images in seconds",
"apiProvider": null,
"inputs": {
"acceptsPrompt": true,
"requiresPrompt": true,
"requiresImage": false,
"acceptsReferenceImages": null,
"acceptsVideo": false,
"acceptsAudio": false,
"acceptsReferenceVideos": false,
"acceptsReferenceAudios": false,
"supportsLoras": true
},
"options": {
"steps": null,
"cfg": null,
"duration": null,
"resolution": null,
"aspectRatio": ["1:1", "3:4", "4:3", "9:16", "16:9"]
},
"cloudAliasTo": null,
"localReady": true,
"cloudEligible": true,
"cloudCost": 4
}
]
}| フィールド | 意味 |
|---|---|
localReady | すべてのモデルファイルがインストールされています。プリセットは今すぐローカルで実行できます。 |
cloudEligible | プリセットは SimpliGen Cloud で実行できます。 |
cloudCost | クラウド実行の概算クレジットコスト (適格でない場合は null)。 |
apiProvider | 外部 API プリセット (OpenAI、Google など) の場合は null 以外。これらは Control API が ディスパッチできない プリセットです。 |
inputs / options | プリセットが受け入れるもの、および POST /generate に渡すことができるオプション範囲/アスペクト比。steps/cfg は高度な制御を公開するプリセットにのみ null 以外です。 |
inputs.requiresPrompt | 高度な制御が組み込まれているプリセット (カットアウト、頭部またはアウトフィット交換、アップスケール) の場合は false です: 空の prompt は有効で、送信するテキストは追加メモとして追加されます。 |
ステータス
GET /status
{
"engineRunning": true,
"engineVersion": "v0.26.0",
"cloudConnected": true,
"creditBalance": 1280,
"activeProject": { "id": "default", "name": "My Project" },
"characters": { "enabled": true, "base": 1, "edit": 1, "i2v": 1, "enhancePresets": 2 }
}POST /engine/start
エンジンがまだ実行されていない場合、ローカルエンジンを開始します。ボディを取得しません。
{ "engineRunning": true, "engineVersion": "v0.37.0", "engineStarting": false }コールドブートはリクエストが待機するより長くかかります。その場合、応答は 202 で engineStarting: true であり、エンジンはブートを続けるため、GET /status をポーリングして engineRunning が true になるまで待ってください。
既に実行されているエンジンを開始すると、200 で alreadyRunning: true が返され、何も変更されません。エンジンがインストールされていない場合、応答は 409 engine_not_installed です: インストールは数ギガバイトのダウンロードであり、API ではなくアプリのジョブのままです。エンジンが実行を拒否するマシンは 409 engine_unsupported_hardware で応答します。再試行しても修正されません。
POST /engine/stop
ローカルエンジンを停止し、その VRAM を解放します。クラウド生成は影響を受けません。既に停止しているエンジンを停止することは成功です。
POST /engine/restart
停止して再度開始します。ウェッジされたエンジンの場合、またはカスタムノードがインストールまたは削除された後。開始時と同じ 202 の動作をします (ブートがリクエストより長い場合)。
プロジェクト
プロジェクトは生成を保持するコンテナです。
GET /projects
{ "projects": [ { "id": "default", "name": "My Project", "slug": "my-project" } ] }POST /projects
{ "name": "Campaign assets" }201 で { "project": { ... } } を返します。name は必須です (それ以外の場合は 400 invalid_options です)。
アップロード
入力 (ソース画像、参照画像、ソース動画) はローカルパスとして渡されません。まずバイトをアップロードして、返された ハンドル を POST /generate に渡してください。
POST /uploads
{ "filename": "ref.png", "dataBase64": "<base64 of the file bytes>" }{ "handle": "a1b2c3d4.png", "sizeBytes": 51234 }最大アップロードは 100 MB です (413 asset_too_large)。サポートされていない拡張子は 400 unsupported_file_type を返します。
生成
POST /generate
生成をエンキューして、即座に jobId で返します。GET /jobs/:id をポーリング (ジョブ を参照) して結果を取得してください。
{
"presetId": "z-image-turbo",
"packId": "local-core-pack",
"mediaType": "image",
"prompt": "a red fox in the snow, cinematic",
"backend": "auto",
"project": "default",
"image": "a1b2c3d4.png",
"referenceImages": [{ "handle": "e5f6.png", "label": "style" }],
"loras": [
{ "name": "RoomLora", "weight": 0.85 },
{ "name": "Mia", "weight": 0.75 }
],
"options": { "aspectRatio": "16:9", "steps": 8, "negativePrompt": "blurry, watermark" }
}| フィールド | 必須 | 注釈 |
|---|---|---|
presetId | はい | GET /capabilities から。 |
mediaType | はい | "image" または "video"。 |
packId | いいえ | 指定する場合、プリセットのパックと一致する必要があります。 |
prompt | 条件付き | プリセットが inputs.requiresPrompt: false を報告しない限り必須です。これらのプリセットには組み込みの手順があります: "" を送信して実行するか、テキストを追加して追加メモを渡してください。 |
backend | いいえ | "auto" (デフォルト)、"local"、または "cloud"。Auto はインストールされている場合はローカルを優先し、それ以外の場合は接続されている場合はクラウドを優先します。 |
image | 条件付き | アップロードハンドル。画像から X へのプリセット (inputs.requiresImage) に必須です。 |
video | 条件付き | アップロードハンドル、動画入力プリセット用。 |
referenceImages | 条件付き | ハンドルまたは { handle, label } の配列、参照画像プリセット用。 |
audio | 条件付き | アップロードハンドル、オーディオ駆動プリセット用 (リップシンク、オーディオ to ビデオ)。プリセットが acceptsAudio を報告する場合は必須です。それ以外の場合、ジョブは needs_audio で拒否されます。 |
audioStartSeconds | いいえ | トラックの開始位置、秒単位。options の下でも受け入れられます。 |
referenceVideos | 条件付き | ハンドル、durationSeconds などの配列、参照クリッププリセット用。 |
referenceAudios | 条件付き | ハンドル、durationSeconds などの配列、参照音プリセット用。 |
loras | いいえ | { name, weight } の配列を適用します (プリセットで inputs.supportsLoras が true の場合)。name は GET /loras の LoRA の表示名またはファイル名と一致します。weight はデフォルトで LoRA のデフォルト強度にデフォルト設定されます。不明な名前は 400 unknown_lora を返します。今のところローカルバックエンドのみ。 |
project | いいえ | プロジェクト id または slug。アクティブなプロジェクトにデフォルト設定されます。 |
options.aspectRatio | いいえ | プリセットのサポートされる比率の 1 つである必要があります。 |
options.steps / options.cfg | いいえ | プリセットのアドバタイズされた範囲内。 |
options.negativePrompt | いいえ | ネガティブプロンプト (UI の詳細設定ネガティブ)。トップレベルで negativePrompt としても受け入れられます。 |
options.durationSeconds | いいえ | ビデオの長さ。 |
options.resolution | いいえ | 解像度レベルラベル。 |
{ "jobId": "gen_abc123", "backend": "local", "status": "queued" }クラウドジョブの場合、応答には "cloudCost": <credits> も含まれます。
バックエンド
外部 API プリセット (ここで apiProvider が null 以外、例: GPT Image 2、Veo) はディスパッチできません。400 unsupported_backend が表示されます。ローカルまたは SimpliGen Cloud プリセットを使用してください。クラウドは接続されたアカウントが必要です (400 cloud_not_connected)。ローカルはモデルがインストールされていることが必要です (400 preset_not_installed、まず準備してください)。
GET /loras
ユーザーがインストールした LoRA をリストアップするため、エージェントが POST /generate の loras 配列に渡すものを検出できます。name (表示名) でマッチングします。
{
"loras": [
{ "name": "RoomLora", "filename": "RoomLora_000002400.safetensors", "baseModel": "flux", "triggerWords": "a room", "defaultStrength": 0.9 },
{ "name": "Mia", "filename": "mia_v2.safetensors", "baseModel": "flux", "triggerWords": "mia", "defaultStrength": 1.0 }
]
}LoRA がプリセットのベースモデル (baseModel) に適合する場所に渡し、プロンプトでそのトリガーワードを使用して起動してください。
ジョブ
GET /jobs/:id
{
"job": {
"jobId": "gen_abc123",
"status": "completed",
"backend": "local",
"mediaType": "image",
"presetId": "z-image-turbo",
"projectId": "default",
"resultUrl": "local-file:///C:/Users/you/.../output.png",
"resultPath": "C:/Users/you/.../output.png",
"errorMessage": null,
"createdAt": "2026-06-25T20:00:00.000Z",
"completedAt": "2026-06-25T20:00:08.000Z"
}
}status は queued、processing、completed、failed のいずれか。成功時は resultPath はデコードされたローカルファイルパスです。失敗時は errorMessage で理由が説明されます。不明な id は 404 job_not_found を返します。
GET /jobs
最新の 25 個のジョブを { "jobs": [ ...job... ] } として返します。
POST /jobs/:id/cancel
キューイング中/実行中のジョブをキャンセルします。{ "jobId", "status", "note?" } を返します。既に進行中のクラウドジョブはサーバーで完了する可能性があります (note に記載)。
プリセットの準備
ローカルプリセットは初回使用時にモデルファイルをダウンロードします。事前に準備できます。
POST /presets/prepare
{ "presetId": "z-image-turbo", "mediaType": "image" }200 { "status": "already_installed" } または 202 { "status": "started" } (ダウンロードはバックグラウンドで実行) を返します。
GET /presets/prepare
進行中のダウンロード: { "downloads": [ ... ] } を返します。このハンドル、または GET /capabilities (ウォッチ localReady) をポーリングしてください。プリセットが準備できるまで。
キャラクター
キャラクタースタジオもスクリプト可能です。キャラクターは ローカルのみ (クラウドは拒否されます)。キャラクター をコンセプトで参照してください。
| エンドポイント | 目的 |
|---|---|
GET /characters | キャラクターをリスト表示。 |
GET /characters/:id | 1 つのキャラクターを取得。 |
GET /character-presets | インストール済みキャラクタープリセット (ベース/編集/i2v)。 |
GET /character-features | 利用可能な身元/外観特徴オプション。 |
POST /characters | キャラクターを作成 (説明から mode: "generate"、またはアップロード済みベース画像ハンドルから "upload")。 |
POST /characters/:id/generate-image | キャラクターの画像を生成 ({ prompt, aspect?, count?, presetId? })。 |
POST /characters/:id/generate-frame | 単一のビデオ開始フレームを生成。 |
POST /characters/:id/animate | キャラクターをビデオにアニメーション化。 |
POST /characters/:id/preset | キャラクターのデフォルトプリセットを設定。 |
POST /characters/:id/enhance | キャラクターアセットをアップスケール/強化。 |
すべての生成エンドポイントは POST /generate と同じく GET /jobs/:id でポーリングする jobId を返します。
レシピ
パックとプリセットのステップアウトマルチステップレシピ (フロー) を作成します。ビルディングブロック、高レベルの仕様から作成、およびオプションで公開を検出します。
| エンドポイント | 目的 |
|---|---|
GET /recipe-blocks | エントリーポイント、ステップとして使用可能なすべてのプリセット、ポートコントラクト付き。 |
POST /recipes/validate | spec (作成+検証) または config のドライラン、保存なし。validation を返します。 |
POST /recipes | spec から作成して下書きを保存。{ recipeId, valid, errors, config } を返します。 |
GET /recipes | このデバイス上のすべてのレシピ (ストアからインストール、またはここで作成) を一覧表示します。inputs (キー、種類、ラベル、必須、オプション) とステップカウント付き。 |
GET /recipes/:id | 1 つのレシピ、その完全設定、inputs および readiness (ステップごと: 実行するプリセット、ローカルにインストールされているかどうか)。 |
POST /recipes/:id/run | レシピを実行。ボディ: { inputs: { key: value }, engine?: "local" | "cloud" | "auto" }。サブジェクト入力はキャラクターまたは製品 id を取ります。画像/ビデオ/オーディオ入力はアップロードハンドルを取ります。その他はすべて平文値を取ります。{ runId, status: "running", engine, steps, cloudCost? } を返します。クラウド実行は事前に価格設定され、トークンの使用額上限に対してカウントされます。 |
GET /recipes/:id/runs | レシピの最近の実行 (最新順)。 |
GET /recipe-runs/:id | 実行のステータス: status (実行中、完了、失敗、キャンセル)、steps (各ステップはステータス、ジョブ id および結果パス付き)、最後のメディアステップが完了すると resultPath。 |
POST /recipe-runs/:id/cancel | 実行を停止。それ以上のステップが開始されません。ローカル進行中ステップが中断されます。 |
POST /recipes/:id/publish | Creator Marketplace に提出 (接続されたアカウントが必要)。 |
製品とサブジェクト
レシピの subject 入力はキャラクターまたは製品のいずれかを取ります。製品は他のサブジェクトタイプです: ベース写真を持つ名前の付いたもの。Product Studio と UGC レシピで使用されます。
| エンドポイント | 目的 |
|---|---|
GET /subjects | レシピが取ることができるすべてのサブジェクト: キャラクターと製品 (id、type、name、status)。 |
GET /products | 製品をリスト表示。 |
GET /products/:id | 1 つの製品を取得。 |
POST /products | アップロード写真から製品を作成: { name, image: <upload handle>, description?, category? }。説明とカテゴリはレシピプロンプトに組み込まれます。{ productId, product } を返します。 |
DELETE /products/:id | 製品とその写真を削除。 |
spec は高レベルの説明です。アプリは自動的にポートをワイヤリングし、ステップ間メディアチェーン、ステップごとのプロンプト入力、次に検証します。
{
"spec": {
"name": "Product to spinning video",
"category": "product",
"steps": [
{ "preset": "krea2-pack:krea2-turbo" },
{ "preset": "wan-2.2-video-pack:wan-2.2-i2v" }
]
}
}{
"recipeId": "b1f2…",
"valid": true,
"errors": [],
"config": { "blocks": [ "…" ], "inputs": [ "…" ], "output": { "from": "n2.video" } }
}作成と保存にはクリエイターアカウントは不要です。POST /recipes/:id/publish は接続されたアカウントが必要で、ユーザーがアプリで 1 つを接続するまで not_connected (で needsConnect: true) を返します。同じドラフトはその後変更なく公開されます。レシピが使用するすべてのプリセットは配布可能なファーストパーティパックに属する必要があります。
使用額上限
トークンに使用額上限がある場合、クラウド生成は事前に価格設定され、残りの許可額を超える場合は拒否されます (402 exceeds_spend_cap)。コストを判定できない場合 (クラウドステータスが利用できない)、キャップ付きトークンはクローズド 503 cost_unknown で失敗します。ローカル生成は常にクレジットコストから無料です。
完全なフロー
BASE=http://127.0.0.1:48199
AUTH="Authorization: Bearer sg-agent-..."
# 1. Pick a ready preset
curl -s $BASE/capabilities -H "$AUTH"
# 2. Generate
JOB=$(curl -s $BASE/generate -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"presetId":"z-image-turbo","mediaType":"image","prompt":"a red fox in the snow","options":{"aspectRatio":"16:9"}}' \
| jq -r .jobId)
# 3. Poll until done, then read resultPath
curl -s $BASE/jobs/$JOB -H "$AUTH" | jq '.job | {status, resultPath, errorMessage}'エラーコード
| HTTP | errorCode | 時期 |
|---|---|---|
| 400 | invalid_json | ボディは有効な JSON ではありません。 |
| 400 | invalid_options | 必須フィールドが見つからないか不正です。 |
| 400 | invalid_preset | プリセット/パック/mediaType が一致しません。 |
| 400 | needs_* | 必須入力 (プロンプト、画像、参照) が見つかりません。 |
| 400 | invalid_handle | 入力は有効なアップロードハンドルではありませんでした。 |
| 400 | unsupported_backend | プリセットは外部 API で実行されます。 |
| 400 | preset_not_installed | ローカルバックエンドが選択されたが、モデルがインストールされていません。 |
| 400 | cloud_not_connected | クラウドバックエンドが選択されたが、アカウントが接続されていません。 |
| 401 | unauthorized | トークンが見つからないか無効です。 |
| 402 | exceeds_spend_cap | クラウドコストがトークンの使用額上限を超えています。 |
| 403 | forbidden_host | ループバック以外の Host ヘッダー。 |
| 404 | not_found / invalid_preset / job_not_found | 不明なルート、プリセット、またはジョブ。 |
| 413 | asset_too_large | 100 MB を超えるアップロード。 |
| 503 | cost_unknown | キャップ付きトークン。クラウドコストを判定できませんでした。 |
| 500 | internal_error | 予期しないサーバーエラー。 |