メインコンテンツへスキップ
実験的 API: この API は実験的であり、変更される可能性があります。エンドポイント、リクエスト/レスポンス形式、および動作は予告なく変更される場合があります。

Comfy Cloud API

Comfy Cloud API は、Comfy Cloud インフラストラクチャ上でワークフローを実行するためのプログラムによるアクセスを提供します。この API はローカルの ComfyUI の API と互換性があり、既存の統合を簡単に移行できます。
サブスクリプションが必要: API へのアクセスは StandardCreator および Pro ティアで利用可能です。Free ティアには API アクセスは含まれません。詳細は料金プランをご覧ください。

クレジットと使用量

API リクエストは、Comfy Cloud のウェブ UI と同じ月間クレジット枠から消費されます。API 専用のクレジットプールはありません。各ティアに含まれるクレジット、追加購入オプション、ワークフロー単位のランタイム上限は、API ジョブにも UI ジョブと同じ条件で適用されます。Creator および Pro ティアの月間クレジット数については、料金プランを参照してください。月の途中でクレジットが不足した場合、アカウントダッシュボードから追加購入できます。

ベース URL

https://cloud.comfy.org

認証

すべての API リクエストには、X-API-Key ヘッダーを介して API キーを渡す必要があります。

API キーの取得

API キーの作成と管理方法については、API キーの取得を参照してください。

API キーの使用

すべてのリクエストで X-API-Key ヘッダーに API キーを渡します:
curl -X GET "https://cloud.comfy.org/api/user" \
  -H "X-API-Key: $COMFY_CLOUD_API_KEY"

核心概念

ワークフロー

ComfyUI ワークフローは、ノードのグラフを記述する JSON オブジェクトです。API は API 形式 のワークフローを受け付けます(ノード ID をキーとし、class_type、inputs などを含む)。この形式は、ComfyUI フロントエンドの「Export Workflow (API)」オプションによって生成されます。

ジョブ

ワークフローを送信すると、ジョブが作成されます。ジョブは非同期で実行されます:
  1. POST /api/prompt を介してワークフローを送信
  2. prompt_id(ジョブ ID)を受け取る
  3. WebSocket を介して進捗を監視するか、ステータスをポーリング
  4. 完了時に出力を取得

並列実行(同時ジョブ)

API ユーザーは、前のジョブの完了を待たずに、複数のワークフローを同時に送信できます。複数の POST /api/prompt リクエストを送信するだけです。特別なヘッダーやパラメーターは必要ありません。ディスパッチャーは、サブスクリプションティアの制限まで、それらを並列で実行します。
サブスクリプションティア同時ジョブ数
Standard1
Creator3
Pro5
同時実行制限を超えて送信されたジョブは、通常通りキューに入れられ、スロットが空くと自動的に実行されます。
並列実行は現在、API を介してのみ利用可能です。サブスクリプションの詳細は料金プランをご覧ください。

例:複数のジョブを並列で送信

import os
import json
import asyncio
import aiohttp

BASE_URL = "https://cloud.comfy.org"
API_KEY = os.environ["COMFY_CLOUD_API_KEY"]

async def submit_workflow(session, workflow):
    """単一のワークフローを送信し、prompt_id を返します。"""
    async with session.post(
        f"{BASE_URL}/api/prompt",
        headers={"X-API-Key": API_KEY, "Content-Type": "application/json"},
        json={"prompt": workflow},
    ) as response:
        result = await response.json()
        return result["prompt_id"]

async def main():
    with open("workflow_api.json") as f:
        base_workflow = json.load(f)

    # シードを変更してバリエーションを作成
    workflows = []
    for seed in [42, 123, 456]:
        workflow = json.loads(json.dumps(base_workflow))
        workflow["3"]["inputs"]["seed"] = seed
        workflows.append(workflow)

    # すべてのワークフローを同時に送信
    async with aiohttp.ClientSession() as session:
        prompt_ids = await asyncio.gather(
            *[submit_workflow(session, wf) for wf in workflows]
        )

    for pid in prompt_ids:
        print(f"Job submitted: {pid}")

    # 各ジョブをポーリングまたは WebSocket で監視...

asyncio.run(main())

出力

生成されたコンテンツ(画像、動画、音声)はクラウドストレージに保存されます。出力ファイルは /api/view エンドポイントを介してダウンロードできます。このエンドポイントは、一時署名付き URL への 302 リダイレクトを返します。

クイックスタート

ワークフローの送信、進捗の監視、出力の取得方法を示す完全な例を以下に示します:

ステップ 1:ワークフローの送信

curl -X POST "https://cloud.comfy.org/api/prompt" \
  -H "X-API-Key: $COMFY_CLOUD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt": '"$(cat workflow_api.json)"'}'

ステップ 2:ジョブの進捗を監視

ポーリングまたは WebSocket を使用して、ジョブの完了を監視できます。

オプション A:ポーリング(シンプル)

ジョブのステータス値: API は以下のいずれかのステータス値を返します。
ステータス説明
pendingジョブがキューに登録され、実行開始を待っています
in_progressジョブが現在実行中です
completedジョブが正常に完了しました
failedジョブでエラーが発生しました
cancelledジョブがユーザーによってキャンセルされました
# ジョブの完了状態をポーリング
curl -X GET "$BASE_URL/api/job/{prompt_id}/status" \
  -H "X-API-Key: $COMFY_CLOUD_API_KEY"

# 応答例:
# {"status": "pending"}      - ジョブがキューに登録済み
# {"status": "in_progress"}  - ジョブが現在実行中
# {"status": "completed"}    - ジョブが正常に完了
# {"status": "failed"}       - ジョブでエラーが発生
# {"status": "cancelled"}    - ジョブがキャンセル済み

オプション B:WebSocket(リアルタイム進捗)

リアルタイムの進捗更新と出力メタデータの収集には:
async function listenForCompletion(
  promptId: string,
  timeout: number = 300000
): Promise<Record<string, any>> {
  const wsUrl = `wss://cloud.comfy.org/ws?clientId=${crypto.randomUUID()}&token=${API_KEY}`;
  const outputs: Record<string, any> = {};

  return new Promise((resolve, reject) => {
    const ws = new WebSocket(wsUrl);
    const timer = setTimeout(() => {
      ws.close();
      reject(new Error(`タスクが ${timeout / 1000} 秒以内に完了しませんでした`));
    }, timeout);

    ws.onmessage = (event) => {
      const data = JSON.parse(event.data);
      const msgType = data.type;
      const msgData = data.data ?? {};

      // 自分のタスクのみをフィルタリング
      if (msgData.prompt_id !== promptId) return;

      if (msgType === "executing") {
        const node = msgData.node;
        if (node) {
          console.log(`ノードを実行中:${node}`);
        } else {
          console.log("実行完了");
        }
      } else if (msgType === "progress") {
        console.log(`進行状況:${msgData.value}/${msgData.max}`);
      } else if (msgType === "executed" && msgData.output) {
        outputs[msgData.node] = msgData.output;
      } else if (msgType === "execution_success") {
        console.log("タスクが正常に完了しました!");
        clearTimeout(timer);
        ws.close();
        resolve(outputs);
      } else if (msgType === "execution_error") {
        const errorMsg = msgData.exception_message ?? "不明なエラー";
        clearTimeout(timer);
        ws.close();
        reject(new Error(`実行エラー:${errorMsg}`));
      }
    };

    ws.onerror = (err) => {
      clearTimeout(timer);
      reject(err);
    };
  });
}

// 完了を待機し、出力を収集
const outputs = await listenForCompletion(promptId);
詳細なメッセージタイプとバイナリプレビュー画像の処理については、WebSocket リファレンスをご覧ください。

ステップ 3:出力のダウンロード

ジョブが完了したら、生成されたファイルをダウンロードします。WebSocket から返される outputs オブジェクト(または履歴エンドポイントを介して利用可能)には、ノード ID ごとに整理された出力データが含まれています。各ノードの出力には、ファイルメタデータを含む imagesvideo、または audio 配列が含まれる場合があります。 出力構造の例:
{
  "9": {
    "images": [
      {
        "filename": "ComfyUI_00001_.png",
        "subfolder": "",
        "type": "output"
      }
    ]
  }
}
ノード ID(この例では "9")は、ワークフロー内の SaveImage または他の出力ノードに対応します。これらの ID は、ワークフロー JSON ファイルを開き、class_typeSaveImageVHS_VideoCombine などのノードを探すことで見つけることができます。
# 単一の出力ファイルをダウンロード(-L オプションで 302 リダイレクトを追跡)
curl -L "$BASE_URL/api/view?filename=output.png&subfolder=&type=output" \
  -H "X-API-Key: $COMFY_CLOUD_API_KEY" \
  -o output.png
/api/view エンドポイントは、一時署名付き URL への 302 リダイレクトを返します。ファイルをダウンロードするには、HTTP クライアントがリダイレクトに従う必要があります。

完全な例

以下は、3 つのすべてのステップを組み合わせた完全なエンドツーエンドの例です:
import { readFile, writeFile } from "fs/promises";

const BASE_URL = "https://cloud.comfy.org";
const API_KEY = process.env.COMFY_CLOUD_API_KEY!;

async function main() {
  // 1. ワークフローを読み込み、変更する
  const workflow = JSON.parse(await readFile("workflow_api.json", "utf-8"));
  workflow["3"].inputs.seed = 42;
  workflow["6"].inputs.text = "a beautiful sunset";

  // 2. ワークフローを送信する
  const response = await fetch(`${BASE_URL}/api/prompt`, {
    method: "POST",
    headers: { "X-API-Key": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({ prompt: workflow }),
  });
  const { prompt_id } = await response.json();
  console.log(`ジョブが送信されました:${prompt_id}`);

  // 3. 完了状態をポーリングする
  while (true) {
    const statusRes = await fetch(`${BASE_URL}/api/job/${prompt_id}/status`, {
      headers: { "X-API-Key": API_KEY },
    });
    const { status } = await statusRes.json();

    if (status === "completed") break;
    if (["failed", "cancelled"].includes(status)) {
      throw new Error(`ジョブが${status}しました`);
    }
    await new Promise((resolve) => setTimeout(resolve, 2000));
  }

  // 4. ジョブ詳細エンドポイント経由で出力を取得する
  const jobRes = await fetch(`${BASE_URL}/api/jobs/${prompt_id}`, {
    headers: { "X-API-Key": API_KEY },
  });
  const job = await jobRes.json();
  const outputs = job.outputs;

  // 5. 出力ファイルをダウンロードする
  for (const nodeOutputs of Object.values(outputs)) {
    for (const fileInfo of (nodeOutputs as any).images ?? []) {
      const params = new URLSearchParams({
        filename: fileInfo.filename,
        subfolder: fileInfo.subfolder ?? "",
        type: "output",
      });
      const viewRes = await fetch(`${BASE_URL}/api/view?${params}`, {
        headers: { "X-API-Key": API_KEY },
        redirect: "manual",
      });
      const signedUrl = viewRes.headers.get("location")!;
      const fileRes = await fetch(signedUrl);
      await writeFile(`./${fileInfo.filename}`, Buffer.from(await fileRes.arrayBuffer()));
      console.log(`ダウンロード完了:${fileInfo.filename}`);
    }
  }
}

main();

利用可能なエンドポイント

カテゴリ説明
ワークフローワークフローの送信、ステータスの確認
ジョブジョブのステータスとキューの監視
入力画像、マスク、その他の入力のアップロード
出力生成されたコンテンツのダウンロード
WebSocketリアルタイムの進捗更新
オブジェクト情報利用可能なノードとその定義

次のステップ

上記のクイックスタートでは、ワークフローの送信と結果の取得の基礎をカバーしています。より高度なユースケースについては、Cloud API リファレンスを参照してください:
  • 入力ファイルのアップロード - 外部入力を必要とするワークフローのために、画像、マスク、またはその他のユーザー提供コンテンツをアップロード
  • ワークフロー入力の修正 - 送信前にプロンプト、シード、またはノード設定などのワークフローパラメーターを動的に変更
  • パートナーノードの使用 - 追加の API キー設定を必要とする外部 AI サービス(Flux Pro、Ideogram など)を呼び出す
  • キュー管理 - キューのステータスの監視、ジョブのキャンセル、または実行中の実行の中断
  • エラー処理 - HTTP エラー、実行失敗の処理、および例外タイプの理解
追加リソース: