> ## Documentation Index
> Fetch the complete documentation index at: https://dripart-willie-des-1087-router-migration-block.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Comfy Router API リファレンス

> Comfy API 契約から生成済みの、Comfy Router のすべてのエンドポイント、パラメータ、レスポンスボディ、エラーバケット。

<div className="router-api-reference-marker" />

モデル ID でアドレス指定される Comfy Router の正規ルート。

ベース URL: `https://api.comfy.org`

以下のすべてのエンドポイントは認証が必要です。`X-API-Key: <api-key>` または `Authorization: Bearer <jwt>` を送信してください。

Comfy API キーは Bearer トークンとして送信することもできます。両方の認証ヘッダーが指定された場合、`X-API-Key` が優先されます。キーと JWT の違いについては[認証ヘッダー](/ja/development/comfy-router/quickstart)を、アクセス要件については[クイックスタート](/ja/development/comfy-router/quickstart)を参照してください。

## エンドポイント

### `GET /v2/models`

**Comfy Router が実行できるモデルを一覧表示します。**

利用可能なモデル ID と課金情報を一覧表示します。`has_more` が true の間は `next_cursor` を使用します。

**パラメータ**

<ParamField query="cursor" type="RouterPageCursor">
  不透明なページネーションカーソル。

  型: [`RouterPageCursor`](#routerpagecursor)、`next_cursor` として返される不透明なカーソル、1〜512文字
</ParamField>

<ParamField query="limit" type="integer">
  1ページに返すモデル数。

  最大 100、デフォルト: 20
</ParamField>

**レスポンス**

<ResponseField name="200" type="RouterModelListResponse">
  OK: モデルカタログの1ページ。

  本文: [`RouterModelListResponse`](#routermodellistresponse)、ヘッダー: `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="400" type="RouterErrorResponse">
  無効なリクエストです。エラータイプとリクエスト本文を確認してください。

  本文: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか、無効です。

  本文: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対して、リクエストは許可されていません。

  本文: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router は一時的に利用できません。バックオフして再試行してください。

  本文: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

### `GET /v2/models/{provider}/{model}`

**正規のモデル ID でパートナーモデル 1 件のカタログエントリを読み取ります。**

カタログ全体を一覧表示せずに、1 つのモデルの詳細を読み取ります。

**パラメータ**

<ParamField path="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデル ID のプロバイダー部分。

  型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字スラッグ（例: `anthropic`）、最大 64 文字
</ParamField>

<ParamField path="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデル ID のモデル部分。

  型: [`RouterModelSegment`](#routermodelsegment) -- 英数字スラッグ（例: `claude-opus-4-6`）、最大 128 文字
</ParamField>

**レスポンス**

<ResponseField name="200" type="RouterModelDetail">
  OK - モデルのカタログエントリ。

  ボディ: [`RouterModelDetail`](#routermodeldetail) -- ヘッダー: `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか無効です。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対して、リクエストは許可されていません。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="404" type="RouterErrorResponse">
  モデル ID が見つかりませんでした。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router は一時的に利用できません。バックオフしながら再試行してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

### `POST /v2/models/{provider}/{model}`

**正規のモデル ID を指定してパートナーモデルを同期的に実行します。**

モデルを実行し、完了した結果を同じレスポンスで受け取ります。

**パラメータ**

<ParamField path="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデル ID のプロバイダー部分。

  型: [`RouterProviderSegment`](#routerprovidersegment): 英数字スラッグ（例: `anthropic`）、最大 64 文字
</ParamField>

<ParamField path="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデル ID のモデル部分。

  型: [`RouterModelSegment`](#routermodelsegment): 英数字スラッグ（例: `claude-opus-4-6`）、最大 128 文字
</ParamField>

<ParamField header="Idempotency-Key" type="string">
  1 つの論理的な呼び出しを安全に再試行できるようにする、呼び出し元が生成するキー。

  1～255 文字
</ParamField>

<ParamField query="model_provider" type="string">
  このモデルの現在のデフォルトではなく、別のプロバイダーを選択します。
</ParamField>

<ParamField query="strict_mode" type="boolean">
  `model_provider` と併用する場合にのみ意味を持ちます。

  デフォルト: False
</ParamField>

<ParamField query="fallback_provider" type="string">
  最初の試行が Router 自身の側に起因する理由、または試行した特定のプロバイダーに起因する理由で失敗した場合に、Router がそのモデルの他の登録済みプロバイダーに対してこの呼び出しを再試行するかどうかを制御します。リクエスト自体に起因する理由で再試行されることは決してありません（再試行されない失敗は、これまでとまったく同じように拒否されます）。
</ParamField>

**リクエストボディ**

`application/json`: [`RouterModelInput`](#routermodelinput)（必須）

パートナーモデル固有の JSON 入力。`model_provider` を指定しない場合、または `strict_mode=true` の場合は、そのままプロバイダーに転送されます。`strict_mode=true` の場合、ボディはすでに代替プロバイダー自身の実際のスキーマである必要があり、このモデル固有のスキーマではありません（`strict_mode` を参照）。`model_provider` で代替プロバイダーを選択し、`strict_mode=false`（デフォルト）の場合は、送信前にボディがそのプロバイダーの実際のスキーマへ変換されます。正確に表現できない固有のフィールドは破棄され、レスポンスの `X-Comfy-Router-Dropped-Params` ヘッダーで開示されます。決して黙って破棄されることはありません。

**レスポンス**

<ResponseField name="200" type="RouterModelOutput">
  OK: `model_provider` がない場合、または `model_provider` があり `strict_mode=false`（デフォルト）の場合は、可能なときはこのモデル固有の契約に変換し戻され、変換に失敗した場合は代替プロバイダー自身の生のレスポンスにフォールバックします（ログに記録され、決して黙って行われることはありません）。形状はこのモデル固有の出力です。`strict_mode=true` の場合は、代替プロバイダーのレスポンスがそのまま返されます。

  ボディ: [`RouterModelOutput`](#routermodeloutput): ヘッダー: `X-Comfy-Request-Id`、`X-Content-Type-Options`、`X-Comfy-Router-Fallback-Provider`、`X-Comfy-Router-Dropped-Params`、`Idempotent-Replayed`、`X-Committed-Spend-Limit`、`X-Committed-Spend-Current`、`X-Committed-Spend-Remaining`
</ResponseField>

<ResponseField name="400" type="RouterErrorResponse">
  無効なリクエストです。エラータイプとリクエストボディを確認してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`、`X-Comfy-Upstream-Status`、`Idempotent-Replayed`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか、無効です。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対して、このリクエストは許可されていません。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="404" type="RouterErrorResponse">
  モデル ID が見つかりませんでした。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="409" type="RouterErrorResponse">
  `X-Comfy-Error-Type` を確認してください: `concurrency_limit_exceeded` は元の呼び出しがまだ実行中であることを意味するため、`Retry-After` を待って同じキーを再利用してください。`invalid_input` の場合は新しいキーが必要です。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`、`Retry-After`（`concurrency_limit_exceeded` の場合）
</ResponseField>

<ResponseField name="413" type="RouterErrorResponse">
  リクエストボディが大きすぎます。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="422" type="RouterValidationErrorResponse">
  リクエストの内容がモデルのスキーマに対して拒否されました。

  ボディ: [`RouterValidationErrorResponse`](#routervalidationerrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`、`Idempotent-Replayed`
</ResponseField>

<ResponseField name="429" type="RouterErrorResponse">
  `X-Comfy-Error-Type` を確認してください: `concurrency_limit_exceeded` は実行中の呼び出しを減らすことを意味し、`rate_limited` は許可ウィンドウを待つことを意味します。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`、`X-Committed-Spend-Limit`、`X-Committed-Spend-Current`、`X-Committed-Spend-Remaining`
</ResponseField>

<ResponseField name="502" type="RouterErrorResponse">
  プロバイダー自身のレスポンスを結果に変換できませんでした（`provider_error`）。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`、`X-Comfy-Upstream-Status`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router は一時的に利用できません。バックオフして再試行してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse): ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="504" type="RouterErrorResponse">
  リクエストがデッドラインを超過しました。再試行する前にエラータイプを確認してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse)。ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status`, `Retry-After`
</ResponseField>

### `GET /v2/models/{provider}/{model}/openapi.json`

**1 つのパートナーモデルの入力スキーマと出力スキーマを OpenAPI ドキュメントとして読み取ります。**

1 つのモデルの入力スキーマと出力スキーマを単体の OpenAPI ドキュメントとして読み取ります。

**パラメータ**

<ParamField path="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデル ID のプロバイダー部分。

  型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字のスラッグ（例: `anthropic`）、最大 64 文字
</ParamField>

<ParamField path="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデル ID のモデル部分。

  型: [`RouterModelSegment`](#routermodelsegment) -- 英数字のスラッグ（例: `claude-opus-4-6`）、最大 128 文字
</ParamField>

<ParamField header="If-None-Match" type="string">
  呼び出し元が以前の `200` で保持した `ETag`。
</ParamField>

**レスポンス**

<ResponseField name="200" type="RouterModelInputSchemaDocument">
  OK - モデルの入力スキーマと出力スキーマを、単体の OpenAPI ドキュメントとして返します。

  ボディ: [`RouterModelInputSchemaDocument`](#routermodelinputschemadocument) -- ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control`
</ResponseField>

<ResponseField name="304" type="no body">
  Not Modified - 呼び出し元が `If-None-Match` で送信した `ETag` 以降、ドキュメントは変更されていません。

  ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか無効です。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対して、リクエストは許可されていません。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="404" type="RouterErrorResponse">
  モデル ID が見つかりませんでした。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="500" type="RouterErrorResponse">
  Router がリクエストを完了できませんでした。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router は一時的に利用できません。バックオフして再試行してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

### `POST /v2/models/{provider}/{model}/requests`

**パートナーモデルの実行をキューに送信し、即座に応答を返します。**

Comfy Router のキュー配信モードです。リクエストボディは、このモデルに対して `POST /v2/models/{provider}/{model}` が受け付けるものと同じパートナー固有の JSON 入力です（1つのボディ形状、モデルごとに1つのスキーマ、2つの配信モード）。ただしこのルートは結果を待つ間コネクションを保持しません。実行を受け付けてハンドルとともに `201` を返し、呼び出し元は後述の3つの読み取りを通じて後で結果を取得します。

**パラメータ**

<ParamField path="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字プロバイダーセグメント。実行対象のモデルを持つパートナーです。

  Type: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字スラグ（例: `anthropic`）、最大64文字
</ParamField>

<ParamField path="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字モデルセグメント。そのプロバイダー内で実行するモデルです。

  Type: [`RouterModelSegment`](#routermodelsegment) -- 英数字スラグ（例: `claude-opus-4-6`）、最大128文字
</ParamField>

<ParamField header="Idempotency-Key" type="string">
  1つの論理的な呼び出しを安全に再試行できるようにする、呼び出し元が生成するキー。

  1～255文字
</ParamField>

**リクエストボディ**

`application/json` -- [`RouterModelInput`](#routermodelinput)（必須）

パートナーモデル固有の JSON 入力で、このモデルに対して同期ルートが受け付けるボディと同一です。実行が受け付けられる前にモデル自身の入力スキーマに対して検証されるため、モデルが拒否するボディは、数分後に失敗するキュー中のリクエストではなく、ここで `422` となります。

**レスポンス**

<ResponseField name="201" type="RouterQueueSubmitResponse">
  Created - 実行がキューに受け付けられました。

  Body: [`RouterQueueSubmitResponse`](#routerqueuesubmitresponse) -- Headers: `X-Comfy-Request-Id`, `Idempotent-Replayed`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか無効です。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="400" type="RouterErrorResponse">
  無効なリクエストです。エラータイプとリクエストボディを確認してください。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="413" type="RouterErrorResponse">
  リクエストボディが大きすぎます。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="402" type="RouterErrorResponse">
  Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自身が報告しなかった理由で失敗しました。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対してリクエストが許可されていません。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="404" type="RouterErrorResponse">
  モデル ID が見つかりませんでした。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="409" type="RouterErrorResponse">
  `X-Comfy-Error-Type` を確認してください: `concurrency_limit_exceeded` は元の呼び出しがまだ実行中であることを意味するため、`Retry-After` を待って同じキーを再利用します。`invalid_input` の場合は新しいキーが必要です。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After`（`concurrency_limit_exceeded` の場合）
</ResponseField>

<ResponseField name="422" type="RouterValidationErrorResponse">
  リクエストの内容がモデルのスキーマに対して拒否されました。

  Body: [`RouterValidationErrorResponse`](#routervalidationerrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router が一時的に利用できません。バックオフして再試行してください。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

### `GET /v2/models/{provider}/{model}/requests/{request_id}`

**送信済みリクエスト1件の結果を収集します。**

収集エンドポイントです。正常に完了したリクエストに対しては、パートナーモデル自身のネイティブ出力を返します。これは同じモデルと同じ入力に対して同期ルートの `200` が返す内容とバイト単位で同一であり、2つの配信モードが同一の結果形状を生成するため、呼び出し側は2つ目のパーサーを用意することなく両者を切り替えられます。

**パラメータ**

<ParamField path="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字のプロバイダーセグメント。モデルを実行するパートナーを指します。

  Type: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字スラッグ、例: `anthropic`、最大64文字
</ParamField>

<ParamField path="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字のモデルセグメント。そのプロバイダー内で実行するモデルを指します。

  Type: [`RouterModelSegment`](#routermodelsegment) -- 英数字スラッグ、例: `claude-opus-4-6`、最大128文字
</ParamField>

<ParamField path="request_id" type="RouterQueueRequestId" required>
  対象となるキュー中のリクエスト。送信時にボディで返された `request_id` です。

  Type: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`, uuid, 最大36文字
</ParamField>

**レスポンス**

<ResponseField name="200" type="RouterModelOutput">
  OK - 出力を生成したリクエストに対するパートナーモデルのネイティブ出力です。正常に完了したリクエスト、または記録された課金と保存された結果の両方を持つターミナルなリクエストが該当し、パートナー自身のメディアタイプのまま変更されずに返されます。同期ルートの `200` が返す内容とまったく同じです。

  Body: [`RouterModelOutput`](#routermodeloutput) -- Headers: `X-Comfy-Request-Id`, `X-Content-Type-Options`
</ResponseField>

<ResponseField name="202" type="RouterQueueStatusResponse">
  Accepted - リクエストはまだ完了していません。

  Body: [`RouterQueueStatusResponse`](#routerqueuestatusresponse) -- Headers: `X-Comfy-Request-Id`, `Retry-After`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか無効です。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対して、このリクエストは許可されていません。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="404" type="RouterErrorResponse">
  モデル ID が見つかりませんでした。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="410" type="RouterErrorResponse">
  Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自身が報告しなかった理由で失敗しました。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router が一時的に利用できません。バックオフして再試行してください。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="409" type="RouterErrorResponse">
  リクエストが操作と競合する状態にあります。エラータイプを確認してください。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="504" type="RouterErrorResponse">
  リクエストが期限を超過しました。再試行する前にエラータイプを確認してください。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="422" type="RouterValidationErrorResponse">
  リクエストのコンテンツがモデルのスキーマに対して拒否されました。

  Body: [`RouterValidationErrorResponse`](#routervalidationerrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed`
</ResponseField>

<ResponseField name="default" type="RouterErrorResponse">
  Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自身が報告しなかった理由で失敗しました。

  Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

### `PUT /v2/models/{provider}/{model}/requests/{request_id}/cancel`

**送信済みのリクエスト 1 件のキャンセルを要求します。**

Comfy に、まだ完了していないリクエストを停止するよう要求します。これは要求であり、保証ではありません。`202` はまさにそのことを示しています。`CANCELLATION_REQUESTED` は要求が受け入れられたことを意味し、実行が停止したことを意味するものではありません。パートナー側ですでに送信中の実行は、そのまま完了してしまう可能性があります。そして完了したパートナー生成は、誰かが結果を受け取ったかどうかに関わらず課金されます。そのため、実際に何が起きたかを知る必要がある呼び出し元は、後でステータスエンドポイントを読み取ってください。そこで有効になったキャンセルは、他のすべてのターミナルな結果と同様に、`error_type` を伴う `COMPLETED` として表されます。

**パラメータ**

<ParamField path="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字のプロバイダーセグメント。実行対象のモデルを持つパートナーです。

  型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字のスラッグ（例: `anthropic`）、最大 64 文字
</ParamField>

<ParamField path="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字のモデルセグメント。そのプロバイダー内で実行するモデルです。

  型: [`RouterModelSegment`](#routermodelsegment) -- 英数字のスラッグ（例: `claude-opus-4-6`）、最大 128 文字
</ParamField>

<ParamField path="request_id" type="RouterQueueRequestId" required>
  対象となるキュー中のリクエスト。送信時にレスポンスボディで返された `request_id` です。

  型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字
</ParamField>

**レスポンス**

<ResponseField name="202" type="RouterQueueCancelResponse">
  受け入れ済み: `CANCELLATION_REQUESTED`。

  ボディ: [`RouterQueueCancelResponse`](#routerqueuecancelresponse) -- ヘッダー: `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="409" type="RouterQueueCancelResponse">
  競合: `ALREADY_COMPLETED`。

  ボディ: [`RouterQueueCancelResponse`](#routerqueuecancelresponse) -- ヘッダー: `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="400" type="RouterErrorResponse">
  無効なリクエストです。エラータイプとリクエストボディを確認してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか無効です。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対して、リクエストは許可されていません。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="404" type="RouterErrorResponse">
  モデル ID が見つかりませんでした。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router は一時的に利用できません。バックオフして再試行してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="default" type="RouterErrorResponse">
  Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自体が報告しなかった理由で失敗しました。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`
</ResponseField>

### `GET /v2/models/{provider}/{model}/requests/{request_id}/status`

**送信済みリクエスト 1 件のキュー状態を読み取ります。**

ポーリング用のエンドポイントです。応答にはリクエストの現在の状態のみが含まれ、結果は含まれないため、クライアントはポーリングのたびに出力を転送することなく長時間の生成を監視できます。結果は、このエンドポイントが `COMPLETED` を返した時点で、後述の読み取りから一度だけ取得されます。

**パラメータ**

<ParamField path="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字プロバイダーセグメント。実行対象となるモデルを持つパートナーです。

  型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字のスラッグ（例: `anthropic`）、最大 64 文字
</ParamField>

<ParamField path="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデル ID の小文字モデルセグメント。そのプロバイダー内で実行するモデルです。

  型: [`RouterModelSegment`](#routermodelsegment) -- 英数字のスラッグ（例: `claude-opus-4-6`）、最大 128 文字
</ParamField>

<ParamField path="request_id" type="RouterQueueRequestId" required>
  対象となるキュー中のリクエスト。送信時にボディで返された `request_id` です。

  型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字
</ParamField>

**レスポンス**

<ResponseField name="200" type="RouterQueueStatusResponse">
  OK: リクエストの現在のキュー状態。

  ボディ: [`RouterQueueStatusResponse`](#routerqueuestatusresponse) -- ヘッダー: `X-Comfy-Request-Id`、`Retry-After`
</ResponseField>

<ResponseField name="401" type="RouterErrorResponse">
  認証情報が不足しているか無効です。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="403" type="RouterErrorResponse">
  この呼び出し元またはモデルに対してリクエストが許可されていません。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="404" type="RouterErrorResponse">
  モデル ID が見つかりませんでした。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="410" type="RouterErrorResponse">
  Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自体が報告しなかった理由で失敗しました。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="503" type="RouterErrorResponse">
  Router は一時的に利用できません。バックオフして再試行してください。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

<ResponseField name="default" type="RouterErrorResponse">
  Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自体が報告しなかった理由で失敗しました。

  ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`
</ResponseField>

ここでの説明は簡潔です。モデルの選択、検証、再試行、課金については [Comfy Router API の使用](/ja/development/comfy-router/api) を、ヘッダーの動作については [ヘッダー](/ja/development/comfy-router/headers) を参照してください。

## エラーバケット

Router の機械可読なエラーカテゴリで、`X-Comfy-Error-Type` ヘッダーでも送信されます。

### リクエストレベルバケット

Router が受け付けたものの、完了できなかったリクエストに対して発生します。

| `error_type`               | 意味                                                                                                                                                                                       |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `invalid_input`            | リクエストがモデルに到達する前に拒否されました。ボディの形式が不正、ページネーションカーソルが不正または期限切れ、モデル自身のスキーマが受け付けない入力、またはこのリクエストに使用できない `Idempotency-Key`（別のリクエストで既に使用済み。方法、パスとクエリ、またはボディが異なる。もしくは、レスポンスを再生できない呼び出しによって既に消費済み）です。 |
| `content_policy_violation` | プロバイダーがコンテンツポリシーを理由にリクエストを拒否しました。                                                                                                                                                        |
| `provider_error`           | パートナープロバイダーが自身の障害を報告したか、Router が結果として解釈できないレスポンスを返しました。                                                                                                                                  |
| `provider_timeout`         | パートナープロバイダーが期限までに応答しませんでした。                                                                                                                                                              |
| `insufficient_credits`     | 呼び出し元のワークスペースに、モデルを実行するための十分なクレジットがありません。                                                                                                                                                |
| `model_not_found`          | `{provider}/{model}` という ID が、Router で実行できるモデルを指していません。不明なプロバイダーもここに分類されます。                                                                                                              |

### トランスポートレベルバケット

モデルへの呼び出しの前またはその周辺で、Router 自身によって発生します。

| `error_type`                 | 意味                                                                                        |
| ---------------------------- | ----------------------------------------------------------------------------------------- |
| `unauthorized`               | リクエストに利用可能な認証情報が含まれていませんでした。                                                              |
| `forbidden`                  | 認証情報は有効ですが、このモデルまたはこの操作に対する権限がありません。                                                      |
| `concurrency_limit_exceeded` | ワークスペースはすでに許可された数の呼び出しを実行中です。いずれかが完了したら再試行してください。                                         |
| `client_disconnected`        | 呼び出し側が、Router が結果を返す前に接続を閉じました。                                                           |
| `internal_error`             | Router 自体が失敗しました。                                                                         |
| `deadline_exceeded`          | 回答が到着する前に、Comfy が自身の設定済みの上限で接続の維持を停止しました。                                                 |
| `not_enabled`                | この呼び出し側に対して Comfy Router がまだ有効になっていません。                                                   |
| `service_unavailable`        | Comfy Router が依存するサービスが一時的に利用できず、呼び出し側に問題はありません。                                          |
| `rate_limited`               | 呼び出し側がウィンドウ単位で測定される割り当てを消費し、そのウィンドウが経過するのを待つ必要があります。                                      |
| `cancelled`                  | キューに入っていたリクエストが、結果を生成する前に、キャンセルルートまたはオペレーターによって取り消されました。これはターミナルであり、それ自体は課金に関する表明ではありません。 |
| `queue_timeout`              | キュー中のリクエストが、一度も受け入れられることなくキュータイムアウトを超えて待機し続けました。                                          |
| `request_not_found`          | `request_id` が、このモデルにおける呼び出し元のどのリクエストも指していません。                                            |

## レスポンスヘッダー

<ResponseField name="Cache-Control" type="string">
  提供されるスキーマドキュメントの鮮度ディレクティブ。
</ResponseField>

<ResponseField name="ETag" type="string">
  提供されるドキュメントのバイト列に対する強力なエンティティタグ。`GET /v2/models/{provider}/{model}/openapi.json` 用です。
</ResponseField>

<ResponseField name="Idempotent-Replayed" type="boolean">
  このレスポンスがモデルを再度実行した結果ではなく、`Idempotency-Key` の記録から提供された場合に存在し、`true` になります。
</ResponseField>

<ResponseField name="Retry-After" type="integer">
  同じ `Idempotency-Key` で同じリクエストを再試行するまでに待つ秒数。
</ResponseField>

<ResponseField name="X-Comfy-Error-Type" type="RouterErrorType">
  障害を表す大まかで機械可読な分類で、Router がすべてのエラーレスポンスに設定します。

  型: [`RouterErrorType`](#routererrortype)
</ResponseField>

<ResponseField name="X-Comfy-Request-Id" type="string">
  この呼び出しに対してサーバーが生成する識別子で、成功、4xx、5xx を問わず、すべての Router レスポンスに存在します。エラーレスポンスこそ、ユーザーがサポートリクエストで引用する ID を必要とするまさにその瞬間だからです。
</ResponseField>

<ResponseField name="X-Comfy-Router-Dropped-Params" type="string">
  文字列の配列を保持する、JSON エンコードされた 1 つの文字列です。カンマで分割するのではなく JSON パーサーでデコードしてください。これはワイヤー上では単一の文字列であり、カンマ区切りの OpenAPI 配列ではないためです。また、各エントリはそれ自体にカンマを含む文です。このヘッダーは、ある変換がこの呼び出しのリクエストボディを生成し、1 つ以上のネイティブフィールドを、それを処理したプロバイダー上で正確に表現できなかった場合に常に存在し、削除された各フィールドとその理由を示します。呼び出し元が `model_provider` でその変換を要求した場合（`strict_mode=false`、これがデフォルト）でも、自動の `fallback_provider` 再試行がそれを実行した場合でも同様です。
</ResponseField>

<ResponseField name="X-Comfy-Router-Fallback-Provider" type="string">
  `fallback_provider` が実際にこの呼び出しを 2 つ目のプロバイダーに対して再試行し、その再試行が成功した場合にのみ存在し、プロバイダー名を示します。最終的にこの呼び出しを処理したプロバイダーであり、試行されて同様に失敗したプロバイダーではありません。
</ResponseField>

<ResponseField name="X-Comfy-Upstream-Status" type="integer">
  この呼び出しに対するモデルプロバイダー自身の HTTP ステータス。
</ResponseField>

<ResponseField name="X-Committed-Spend-Current" type="integer">
  呼び出し元が現在、まだ実行中の呼び出しに対してコミットしている金額（米ドルのセント単位）。
</ResponseField>

<ResponseField name="X-Committed-Spend-Limit" type="integer">
  呼び出し元がまだ実行中の呼び出しにコミットできるパートナー支出の上限（米ドルのセント単位）。この金額は呼び出しが受け付けられた時点で確保され、その呼び出しが完了した時点で解放されます。
</ResponseField>

<ResponseField name="X-Committed-Spend-Remaining" type="integer">
  上限までに残っている余裕（米ドルのセント単位）。下限は 0 です。
</ResponseField>

<ResponseField name="X-Content-Type-Options" type="string">
  Router モデルのすべての成功した実行において、常に `nosniff` です。
</ResponseField>

## 結果アセット

モデルは、アセット URL、インラインバイト、またはその両方を返すことができます。以下のプロバイダーは、選択済みのアセットを Comfy ストレージにコピーし、その URL を置き換えます。この動作はモデルによって異なります。これを選択するリクエストヘッダーはありません。

| モデル                                                  | Comfy ストレージにコピーされるもの                   | Comfy ホスト URL の最大有効期間 |
| ---------------------------------------------------- | -------------------------------------- | --------------------- |
| `bfl/*`                                              | 完了したアセット、および結果に含まれている場合はドラフトキャッシュのアセット | 24 時間                 |
| `byteplus/*` ビデオモデル (`seedance`、`dreamina-seedance`) | 完了したビデオ、および結果に含まれている場合はラストフレーム画像       | 24 時間                 |
| `minimax/*`                                          | 完了したビデオ                                | 12 時間                 |
| `xai/*`                                              | 生成されたすべての画像、および完了したビデオ                 | 24 時間                 |

これらの有効期間は、URL を開いたときではなく、URL が署名されたときに開始されます。キャッシュされた URL や再生された URL は残り時間が短い場合があります。再生しても有効期間は更新されません。アセットは速やかにダウンロードしてください。コピーされるのは各行に記載されたアセットのみです。`byteplus/seedream-*` と `byteplus/seededit-*` の画像は BytePlus ビデオの行には含まれません。

**Veo (`veo/*`) には別のストレージパスがあります。** `response.videos[]` では、存在する方のメンバーを読み取ってください。`bytesBase64Encoded` はクリップをインラインで含み、`gcsUri` は、プロバイダーから Comfy ストレージへの直接書き込みが環境で構成されている場合に、Comfy が署名した HTTPS リンクを含みます。そのリンクはレスポンスから 24 時間有効です。後者の場合はアセットをコピーするのではなく直接書き込むため、Veo は再ホスティングの表には含まれていません。

その他のモデルは、プロバイダーのアセット参照またはインラインバイトを返します。プロバイダーの URL はプロバイダーの有効期限に従います。これは上記の有効期間よりはるかに短い場合があり、Router の契約では規定されていません。

コピーはアセットごとのベストエフォートです。1 つのコピーが失敗した場合、そのエントリはプロバイダーの参照を保持します。レスポンスには Comfy とプロバイダーの両方の URL が含まれる可能性があり、アセットごとの明示的なコピーステータスフィールドはありません。生成は引き続き成功し、課金されます。1 つの正常に再ホストされたアセットから、すべての URL の有効期間を推測しないでください。

結果が Comfy ホストかどうかは、完了した呼び出しが後でその `Idempotency-Key` レコードから再生できるかどうかも決定します。上記の `Idempotency-Key` パラメーターは、再生できない場合に再試行が何で応答されるかを説明しています。

<span id="per-model-input-schemas" />

## モデルごとの入力および出力スキーマ

各モデルのフィールドは `GET /v2/models/{provider}/{model}/openapi.json` から読み取ります。オペレーションの `requestBody` は入力の検証を記述しており、その `200` レスポンスは、スキーマが作成されている場合に出力の形状とメディアタイプを記述しています。`x-comfy-input-schema-authored` が false の場合、Router はモデル固有の事前検証なしで任意の JSON オブジェクトを受け入れます。プロバイダーの要件は引き続き適用されます。出力スキーマは結果を記述するものであり、Router は返されたプロバイダーのペイロードをそれらに対して検証しません。スキーマが作成されていない出力では、`application/json` ではなく `*/*` が使用される場合があります。デコードする前にレスポンスのコンテンツタイプを確認してください。

## スキーマ

### RouterChargesOnPolicyRejection

このモデルでコンテンツポリシーによる拒否が課金されるかどうか。不明な値は課金される可能性があるものとして扱ってください。

型: `string`

### RouterErrorResponse

認証、アクセス、モデル検索、クォータ、およびプロバイダー転送の失敗に対するエラーボディ。

**フィールド**

<ResponseField name="detail" type="string" required>
  失敗内容を人間が読める形式で記述したもの。エンドユーザーに提示しても安全です。機械的にパースされることはありません。分岐には `error_type` を使用してください。
</ResponseField>

<ResponseField name="error_type" type="RouterErrorType" required>
  Router の失敗を表す粗い機械可読な分類。レスポンスヘッダー `X-Comfy-Error-Type` にも反映されるため、呼び出し側はボディをパースせずに分岐できます。値の集合は 15 個で固定されています。リクエストレベルの 6 つの分類 `invalid_input`、`content_policy_violation`、`provider_error`、`provider_timeout`、`insufficient_credits`、`model_not_found` に加えて、転送レベルの `unauthorized`、`forbidden`、`concurrency_limit_exceeded`、`client_disconnected`、`internal_error`、`deadline_exceeded`、`not_enabled`、`service_unavailable`、`rate_limited` があります。

  型: [`RouterErrorType`](#routererrortype)
</ResponseField>

### RouterErrorType

機械可読な Router エラーのカテゴリ。`X-Comfy-Error-Type` ヘッダーでも送信されます。

型: `string`

### RouterModelBilling

モデルを呼び出す前に確認すべき課金の挙動。価格や使用量は含まれません。

**フィールド**

<ResponseField name="charges_on_policy_rejection" type="RouterChargesOnPolicyRejection" required>
  このモデルがコンテンツポリシー上の理由で拒否した呼び出しが、それでも呼び出し元に課金されるかどうか。プロバイダーによって異なり、その違いは呼び出し時には見えず、同じ呼び出しに対してエラーと課金の両方を見たユーザーは知りようがありません。そのため、プロバイダーごとの慣習に任せるのではなく、呼び出し前にモデルごとに明記されています。

  タイプ: [`RouterChargesOnPolicyRejection`](#routerchargesonpolicyrejection)
</ResponseField>

### RouterModelDetail

1つの Comfy Router モデルに対するモデル単位の詳細です。カタログ一覧が報告するすべての内容に加えて、単一モデルルートだけが持つモデル単位のフィールドを含みます。

[`RouterModelListEntry`](#routermodellistentry)、[`RouterModelDetailFields`](#routermodeldetailfields) を組み合わせます。

型: `object`

### RouterModelDetailFields

モデル詳細エンドポイントが返すオプションフィールド。

**フィールド**

<ResponseField name="input_schema_url" type="string">
  このモデルのOpenAPIドキュメントのURL。入力スキーマと出力スキーマを含みます。

  HTTPS URL（例: `https://api.comfy.org/v2/models/bfl/flux-2-pro/openapi.json`）、最大2048文字
</ResponseField>

### RouterModelId

`POST /v2/models/{provider}/{model}` で使用されるモデル ID。

型: `文字列`。モデル ID（例: `anthropic/claude-opus-4-6`）、最大 193 文字

### RouterModelInput

モデル入力オブジェクト。フィールドと検証については、選択済みモデルの OpenAPI ドキュメントを参照してください。

型: `object`

### RouterModelInputSchemaDocument

1つのモデルの入力と出力に対応するスタンドアロンの OpenAPI ドキュメント。

型: `object`

### RouterModelListEntry

モデルのIDと課金に関する事実。

**フィールド**

<ResponseField name="id" type="RouterModelId" required>
  正規の Comfy Router モデルID、`{provider}/{model}`。これは `POST /v2/models/{provider}/{model}` でモデルを指定する値そのものであり、呼び出し側は他の何かから再導出することなく、この値をそのパスに埋め込むことができます。その `pattern` は `RouterProviderSegment` と `RouterModelSegment` を単一の `/` で結合したもので、`maxLength` はそれらの合計にその区切り文字を加えた値です。

  型: [`RouterModelId`](#routermodelid) -- モデルID、例: `anthropic/claude-opus-4-6`、最大193文字
</ResponseField>

<ResponseField name="provider" type="RouterProviderSegment" required>
  正規の `{provider}/{model}` モデルIDの小文字の `provider` セグメント。モデルを指定する対象のパートナーを表します。呼び出しルートの `provider` パスパラメータとカタログエントリの `provider` フィールドはどちらもこの1つのスキーマを参照しており、これによって一覧に載るIDと受け入れられるIDが乖離しないようになっています。

  型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字のスラッグ、例: `anthropic`、最大64文字
</ResponseField>

<ResponseField name="model" type="RouterModelSegment" required>
  正規の `{provider}/{model}` モデルIDの小文字の `model` セグメント。そのプロバイダー内で実行するモデルを表します。呼び出しルートの `model` パスパラメータとカタログエントリの `model` フィールドで共有されており、`RouterProviderSegment` と同じく乖離を防ぐためのものです。

  型: [`RouterModelSegment`](#routermodelsegment) -- 英数字のスラッグ、例: `claude-opus-4-6`、最大128文字
</ResponseField>

<ResponseField name="billing" type="RouterModelBilling" required>
  呼び出しの前に呼び出し側が必要とする、モデルごとの課金に関する事実であり、価格ではありません。使用量やコストの数値がここに現れることは決してありません。

  型: [`RouterModelBilling`](#routermodelbilling)
</ResponseField>

### RouterModelListResponse

Router モデルカタログの 1 ページです。

**フィールド**

<ResponseField name="data" type="array of RouterModelListEntry" required>
  このページのモデルで、最大 `limit` 件です。

  型: [`RouterModelListEntry`](#routermodellistentry) の配列
</ResponseField>

<ResponseField name="has_more" type="boolean" required>
  このページより先に別のページが存在するかどうか。これが true の間はページを進め続けてください。`data` が短い、または空であることからカタログの終端を推測しないでください。
</ResponseField>

<ResponseField name="next_cursor" type="RouterPageCursor">
  Router リストへの不透明なカーソルです。サーバーによって生成され、そのまま往復されるだけです。オフセットではなく、モデル ID でもなく、順序付けもされておらず、カタログの再構築をまたいで安定もしません。したがって、これを解析したり、インクリメントしたり、取得元の走査を超えて永続化したりすることは、いずれも契約の範囲外です。オフセットではなくカーソルである理由は、カタログが変化するリストだからです。走査の途中でエントリが追加または削除されると、オフセットによる走査はエントリを黙ってスキップしたり繰り返したりしますが、呼び出し側はそれが起きたことを判別できません。

  型: [`RouterPageCursor`](#routerpagecursor)。`next_cursor` として返される不透明なカーソルで、1～512 文字です。
</ResponseField>

<ResponseField name="limit" type="integer" required>
  実際に提供されたページサイズです。最大値を超える `limit` を要求した場合、拒否されるのではなく最大値にクランプされるため、要求した値より小さくなることがあります。ページネーションには、送信した値ではなくこの数値を使用してください。そうしないと、受け取っていない行を前提にしてしまいます。

  1～100
</ResponseField>

### RouterModelOutput

モデルの結果オブジェクトです。正確な形状については、選択済みモデルの出力スキーマを参照してください。

型: `object`

### RouterModelSegment

`{provider}/{model}` モデル ID のモデル部分です。

型: `string` -- 英数字のスラッグ（例: `claude-opus-4-6`）、最大 128 文字

### RouterPageCursor

不透明なカタログカーソルです。変更を加えずにそのまま `cursor` として渡し直してください。

型: `string`。`next_cursor` として返される不透明なカーソルで、1～512文字です。

### RouterProviderSegment

`{provider}/{model}` というモデル ID のプロバイダー部分です。

型: `string`。英数字のスラッグ（例: `anthropic`）、最大 64 文字

### RouterQueueCancelResponse

このルートが解決したリクエストを表す2つのステータス、すなわち `202` と `400` に対するキャンセル要求への応答です。成功用のエンベロープとエラー用のエンベロープに分けるのではなく、両ステータスで単一のボディ形状をとります。どちらも「キャンセルで何が見つかったか」という同じ内容を伝えるものであり、ステータスコードごとに異なる型をパースしなければならないクライアントにとって、分割による利点は何もないからです。

**フィールド**

<ResponseField name="request_id" type="RouterQueueRequestId" required>
  キュー中の1件の Router リクエストの識別子。呼び出し側がポーリング、キャンセル、結果の取得に使うハンドルです。

  型: [`RouterQueueRequestId`](#routerqueuerequestid)、`pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大36文字
</ResponseField>

<ResponseField name="status" type="RouterQueueCancelStatus" required>
  キャンセル要求で何が見つかったかを示します。このルートが実際に解決したリクエストを表す2つの結果に対応します。どちらも HTTP ステータスに反映されるため、クライアントはどちらで分岐してもかまいません。

  型: [`RouterQueueCancelStatus`](#routerqueuecancelstatus)
</ResponseField>

### RouterQueueCancelStatus

このルートが実際に解決したリクエストを表す2つの結果について、キャンセル要求が見つけた内容です。どちらも HTTP ステータスに反映されるため、クライアントはどちらで分岐してもかまいません。

型: `string`

### RouterQueuePosition

レスポンスが構成された時点で、このリクエストより前にキュー内にあるリクエストの数。0 はこのリクエストが先頭であることを意味します。

型: `integer` -- 0 以上

### RouterQueueRequestId

キュー中の Router リクエスト 1 件の識別子。呼び出し元がポーリングやキャンセル、結果の取得に用いるハンドルです。

型: `string`、`pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字

### RouterQueueStatus

キュー中の Router リクエストの状態。値はちょうど 3 つで、`RouterErrorType` とは異なり、これは閉じた `enum` です。2 つのスキーマは意図的に逆方向に閉じられているためです。`RouterErrorType` は失敗を分類するもので、その集合は増えていくことが想定されているため、認識できないバケットをハード拒否する生成済みクライアントは、すでに何かが失敗したまさにその時に最も激しく失敗することになります。一方、これはライフサイクルであり、後で 4 つ目の状態が追加されたライフサイクルは、enum として宣言されているかどうかに関わらず、それに対して書かれたすべてのポーリングループにとって破壊的変更となります。そのため enum として宣言され、その制約はクライアントが見られる場所に明記されています。

Type: `string`

### RouterQueueStatusFields

`RouterQueueStatusResponse` のうち URL ブロックではない半分です。キュー中のリクエスト 1 件の識別情報、その現在の状態、そしてその状態がターミナルで実行が成功しなかった場合は、その理由を示す粗い分類です。

**フィールド**

<ResponseField name="request_id" type="RouterQueueRequestId" required>
  キュー中の Router リクエスト 1 件の識別子。呼び出し側がポーリング、キャンセル、結果の取得を行うためのハンドルです。

  型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字
</ResponseField>

<ResponseField name="status" type="RouterQueueStatus" required>
  キュー中の Router リクエストの状態。値はちょうど 3 つで、`RouterErrorType` とは異なり、これは閉じた `enum` です。これは 2 つのスキーマが意図的に逆方向に閉じられているためです。`RouterErrorType` は失敗を分類するものであり、その集合は増えていくことが想定されているため、認識されない分類をハード拒否する生成済みクライアントは、すでに何かが失敗したまさにそのときに最も大きく失敗することになります。こちらはライフサイクルであり、後で 4 番目の状態が追加されるライフサイクルは、enum として宣言されているかどうかに関わらず、それに対して書かれたすべてのポーリングループにとって破壊的変更となります。そのため enum として宣言され、その制約はクライアントが見える場所に明記されています。

  型: [`RouterQueueStatus`](#routerqueuestatus)
</ResponseField>

<ResponseField name="queue_position" type="RouterQueuePosition">
  レスポンスが構成された時点で、キュー内でこのリクエストより前に並んでいるリクエストの数。ゼロはこのリクエストが先頭であることを意味します。

  型: [`RouterQueuePosition`](#routerqueueposition) -- 0 以上
</ResponseField>

<ResponseField name="error_type" type="RouterErrorType">
  成功しなかった `COMPLETED` リクエストにのみ存在し、その失敗を返すときに結果の読み取りが `X-Comfy-Error-Type` に設定するのと同じ粗い分類を持ちます。これは、成功したターミナルリクエストと、失敗またはキャンセル済みのリクエストを区別するものです（どちらにも別個のターミナルステータスはありません）。また、成功時には null ではなく存在しません（ABSENT）。そのため、その有無で分岐してください。

  型: [`RouterErrorType`](#routererrortype)
</ResponseField>

### RouterQueueStatusResponse

キュー中のリクエスト1件の現在の状態を、送信時に返されたものと同じ3つのURLと組み合わせたものです。

[`RouterQueueUrls`](#routerqueueurls)、[`RouterQueueStatusFields`](#routerqueuestatusfields) を構成要素とします。

型: `object`

### RouterQueueSubmitFields

`RouterQueueSubmitResponse` のうち URL ブロックではない半分: 新しいリクエストの識別情報と、それが受け付けられた時点での状態です。

**フィールド**

<ResponseField name="request_id" type="RouterQueueRequestId" required>
  キュー中の Router リクエスト1件の識別子。呼び出し元がポーリング、キャンセル、結果の収集に使うハンドルです。

  型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`, uuid, 最大36文字
</ResponseField>

<ResponseField name="status" type="RouterQueueStatus" required>
  キュー中の Router リクエストの状態。値はちょうど3つで、`RouterErrorType` とは異なりこちらは閉じた `enum` です。これは2つのスキーマが意図的に逆方向に閉じられているためです。`RouterErrorType` は失敗を分類するものであり、その集合は増えていくことが想定されているため、未知のバケットを厳格に拒否する生成済みクライアントは、すでに何かが失敗したまさにそのときに最も失敗しやすくなります。一方こちらはライフサイクルであり、後で4番目の状態が追加されたライフサイクルは、enum として宣言されているかどうかに関わらず、それに対して書かれたすべてのポーリングループにとって破壊的変更となります。そのため enum として宣言され、その制約はクライアントが見られる場所に明記されています。

  型: [`RouterQueueStatus`](#routerqueuestatus)
</ResponseField>

<ResponseField name="queue_position" type="RouterQueuePosition">
  レスポンスが構成された時点で、キュー内でこのリクエストより前に何件のリクエストがあるか。ゼロはこのリクエストが先頭であることを意味します。

  型: [`RouterQueuePosition`](#routerqueueposition) -- 0以上
</ResponseField>

### RouterQueueSubmitResponse

実行がキューに受け入れられたときに返されるハンドルです。リクエストの識別情報と状態を、そのライフサイクルの残りの部分を指す 3 つの URL と合成したものです。

[`RouterQueueUrls`](#routerqueueurls)、[`RouterQueueSubmitFields`](#routerqueuesubmitfields) を合成します。

型: `object`

### RouterQueueUrls

キュー中の1つのリクエストの残りのライフタイムに対応する3つのURLです。有効なハンドルを含むすべてのレスポンスで返されるため、クライアントが自分でキューURLを組み立てることはありません。

**フィールド**

<ResponseField name="status_url" type="string" required>
  このリクエストのステータス読み取りの絶対URL。

  URI
</ResponseField>

<ResponseField name="response_url" type="string" required>
  このリクエストの結果を取得する絶対URL。

  URI
</ResponseField>

<ResponseField name="cancel_url" type="string" required>
  キャンセルを要求する絶対URL。

  URI
</ResponseField>

### RouterValidationErrorContext

失敗した検証ルールについてプロバイダーが提供する詳細。

型: `object`

### RouterValidationErrorDetail

1 件のフィールドレベルの検証失敗。

**フィールド**

<ResponseField name="loc" type="array of any" required>
  問題のあるフィールドへのパス。最も外側のセグメントが先頭に来ます。たとえば `["body", "image_url"]`、または `["body", "images", 0]` のように、整数は配列のインデックスを指します。
</ResponseField>

<ResponseField name="msg" type="string" required>
  この単一の失敗についての、人間が読める説明。
</ResponseField>

<ResponseField name="type" type="string" required>
  この失敗の具体的で機械可読な理由。プロバイダーからそのまま渡されます。これは型付き SDK の例外階層が分岐に使う値であり、レスポンスヘッダーの `error_type` はその大まかな分類にすぎません。
</ResponseField>

<ResponseField name="ctx" type="RouterValidationErrorContext">
  1 件の `RouterValidationErrorDetail` で違反した境界値。プロバイダーからそのまま渡されます。たとえば `greater_than` に対する `{"limit_value": 8}`、`image_too_small` に対する `{"min_width": 512}`、`file_too_large` に対する `{"max_size_bytes": 10485760}` などです。キー集合はプロバイダーとエラータイプに固有であるため、これは意図的にオープンなオブジェクトとしています。固定のフィールドリストに絞り込んだり、`msg` 文字列に畳み込んだりすると、まさに移植された統合がコンパイルは通るものの、その境界値を読んでいた分岐を黙って失うことになります。エラータイプが境界値を持たない場合は省略されます。

  型: [`RouterValidationErrorContext`](#routervalidationerrorcontext)
</ResponseField>

<ResponseField name="input" type="RouterValidationErrorInput">
  問題のある入力値。呼び出し元が `loc` から再導出することなく、何が拒否されたかを確認できるよう、そのままエコーバックされます。任意の JSON 型（文字列、数値、ブール、配列、オブジェクト、null）であるため、このスキーマは意図的にオブジェクトに絞り込まず、型なしのままにしています。プロバイダーが入力値をエコーバックしない場合は省略されます。

  型: [`RouterValidationErrorInput`](#routervalidationerrorinput)
</ResponseField>

### RouterValidationErrorInput

プロバイダーが含める場合の、拒否された入力値です。

### RouterValidationErrorResponse

`422` 検証エラーのレスポンスボディ。カテゴリについては `X-Comfy-Error-Type` を参照してください。

**フィールド**

<ResponseField name="detail" type="array of RouterValidationErrorDetail" required>
  リクエストで検出されたすべての検証失敗。問題のあるフィールドごとに 1 エントリ。

  型: [`RouterValidationErrorDetail`](#routervalidationerrordetail) の配列
</ResponseField>
