ガイド
エラー
CheaperGen APIの全エラーコードとHTTPステータス(400、401、402、404、409、429、502、503)を解説。各原因と対処・再試行の方法も掲載しています。
APIは一般的なHTTPステータスコードを使います:2xxは成功、4xxはリクエストの修正が必要、5xxは当社側または上流のエラーです。エラーレスポンスはすべて同じJSON形式なので、一か所で処理できます。
エラー形式#
{
"error": {
"code": "invalid_request",
"message": "\"resolution\" must be one of: 480p, 720p",
"param": "resolution"
}
}code— 安定した機械可読文字列です。メッセージではなく、この値に基づいて分岐してください。message— ログに記録しても問題のない、人が読める説明です。文言は変更される場合があります。param— 特定のリクエスト項目が原因の場合に設定されます。
エラーコード#
| HTTP | コード | 内容 | 対処方法 | 再試行できますか? |
|---|---|---|---|---|
| 400 | invalid_request | リクエスト本文が有効なJSONではない、必須項目がない、値が範囲外または未許可、未定義のパラメーターが含まれている、プロンプトの参照先がない、または参照動画・音声が読み取れない/モデルの上限(長さ、サイズ、解像度、フレームレート)を超えています。paramが問題のフィールドを示します。 | リクエストを修正してください。エラーメッセージに問題の内容が示されます。 | 修正後に再試行 |
| 401 | unauthorized | APIキーがない、形式が不正、または失効しています。 | Authorization: Bearerヘッダーと、キーが有効であることを確認してください。 | 修正後に再試行 |
| 402 | insufficient_balance | 残高がこの生成の料金に足りません。請求は発生していません。 | クレジットを追加するか、ダッシュボード → お支払いで自動チャージを有効にしてください。詳しくはお支払いをご覧ください。 | 修正後に再試行 |
| 404 | not_found | エンドポイントID、モデル、または生成が存在しないか、生成が別のアカウントに属しています。 | IDをモデル一覧と照合してください。 | いいえ |
| 409 | conflict | リソースの状態とリクエストが競合しています。たとえば、すでに実行中または完了した生成をキャンセルしようとした場合です。 | 生成情報を取得し、現在のステータスを確認してください。 | いいえ |
| 410 | model_delisted | このモデルは提供を終了しました。生成は送信されず、料金も発生していません。過去の生成情報は引き続き確認できます。 | モデル一覧から別のモデルを選択してください。 | いいえ |
| 429 | rate_limited | 1秒あたりのリクエスト数の上限を超えたか、開始待ちの生成のキューが満杯です。 | 時間を置いて再試行してください。詳しくはレート制限をご覧ください。 | バックオフ後に再試行 |
| 500 | internal_error | 当社側で問題が発生しました。 | 間隔を空けて再試行してください。解決しない場合は、リクエスト時刻を添えてサポートにお問い合わせください。 | バックオフ後に再試行 |
| 501 | direct_upload_unavailable | このデプロイ環境では、直接アップロード(署名付きURL)を利用できません。 | 代わりにmultipart/form-dataでアップロードしてください。詳しくはアップロードをご覧ください。 | いいえ |
| 502 | — | リクエストが当社APIに届く前に発生したゲートウェイまたはネットワークエラーです(まれに発生します)。モデルの上流で発生したエラーはHTTPエラーとしては返されず、生成のエラー理由に記録されます。 | 間隔を空けて再試行してください。料金は発生していません。 | バックオフ後に再試行 |
| 503 | model_unavailable | このモデルは一時的に新しい生成を受け付けていません。 | 時間を置いて再試行するか、別のモデルを選んでください。ステータスページを確認してください。 | バックオフ後に再試行 |
| 503 | pricing_unavailable | 一時的に価格を確認できなかったため、リクエストの料金は算出されていません。送信も課金もされていません。 | 数秒後に、同じIdempotency-Keyを付けて同じリクエストを再試行してください(レスポンスのRetry-Afterヘッダーを確認)。 | バックオフ後に再試行 |
| 503 | fallback_price_declined | 通常の処理容量が利用できず、現在利用できるのは公式価格以下の緊急時料金のみです。リクエストではallow_fallback_price: falseを指定しています。請求は発生しておらず、メッセージに両方の料金が表示されます。 | 標準料金で利用できるまで待つか、緊急時の料金を受け入れるにはデフォルトのallow_fallback_price: trueを送信してください。 | バックオフ後に再試行 |
| 400 | max_cost_exceeded | 緊急時の料金を含めた金額が、max_cost_usdの上限を超えています。請求は発生していません。 | 解像度または長さを下げるか、価格を確認してmax_cost_usdの上限を引き上げてください。 | 修正後に再試行 |
生成中に発生するエラー#
HTTPエラーはリクエスト自体が拒否されたことを示し、料金は発生しません。受け付け後に失敗した生成とは異なります。API呼び出しは成功しています(ジョブがすぐに失敗してPOST /runが202を返す場合も同様です)。生成のstatusはfailedとなり、errorオブジェクトにエラーが記録されます。確保額は自動返金されます。同じオブジェクトはGET /generations、Webhookのペイロード、MCPツールの結果にも含まれます。
{
"status": "failed",
"error": {
"code": "generation_failed",
"message": "ByteDance's safety review for Seedance 2.0 Fast rejected this request (the prompt or an input file).",
"reason": "content_blocked",
"hint": "Describe the character's look instead of naming a copyrighted character or real person, keep it non-explicit, or try another model.",
"retryable": false,
"refunded": true,
"detail": "リクエストがコンテンツ安全性チェックを通過しませんでした。プロンプトを修正して、もう一度お試しください。"
}
}codeは大分類です(提供開始時から変わらない4つの値)。reasonは失敗理由を示します。新しい連携ではこの値に基づいて処理し、messageとhintをユーザーに表示してください。retryableは同じリクエストの再送で成功する可能性を示し、paramは原因が判定できた場合に変更するフィールド、detailはモデル提供元の文言です。
| error.reason | error.code | 発生したこと | 対処方法 | そのまま再送しますか? |
|---|---|---|---|---|
content_blocked | generation_failed | モデル提供元の安全性フィルターが、プロンプト、入力ファイル、または生成結果を拒否しました(著作権で保護されたキャラクター名、実在の人物、露骨なコンテンツなど)。エラーメッセージには、どのモデルのフィルターが拒否したかが表示されます。 | プロンプトを書き換えてください(キャラクター名、ブランド名、実在の人物名を書く代わりに、見た目を説明してください)。入力ファイルを変更するか、別のモデルをお試しください。同じ内容をそのまま再送信しても、同様に失敗します。 | いいえ — 先に内容を変更 |
invalid_input | generation_failed | モデルが入力または設定を受け付けませんでした。ファイルサイズが大きすぎる、未対応形式、寸法やアスペクト比の不一致、長さ超過、または無効な値などが考えられます。判別できる場合はparamに項目名を表示します。 | 該当する項目を修正して再送信してください(制限はモデルのAPIページをご確認ください)。別のモデルを試す方法もあります。 | いいえ — 先に内容を変更 |
input_unreachable | generation_failed | 入力URLをダウンロードできませんでした。サインインが必要、署名付きリンクの有効期限切れ、ファイルへ直接つながっていない、またはホスト側がリクエストを拒否した可能性があります。モデル提供元がファイルを取得できない場合、通常は当社側でダウンロードしてコピーを使い、再試行します。そのため、このエラーは多くの場合、ファイルをまったくダウンロードできなかったことを意味します。 | 公開されたファイル直リンクを使うか、POST /api/v1/uploadsでファイルをアップロードしてから、もう一度送信してください。 | いいえ — 先に内容を変更 |
upstream_unavailable | upstream_error | モデルの処理提供元が停止中、過負荷、または処理能力の上限に達していました。利用可能な経路をすべて試しましたが、実行できませんでした。 | 1~2分後に再試行するか、別のモデルをお試しください。 | はい |
upstream_error | upstream_error | 利用可能な経路をすべて試しましたが、生成中にモデル処理側で内部エラーが発生しました。 | 再試行してください。この種のエラーは一時的なことが多くあります。繰り返し失敗する場合は、別のモデルをお試しください。 | はい |
timeout | timeout | 生成が制限時間内に完了しませんでした(処理側の制限、または当社の40分制限)。 | 再試行してください。短いクリップや低解像度のクリップは、より早く完了します。 | はい |
output_unavailable | upstream_error | モデルの処理は完了しましたが、利用可能なファイルが返されなかったか、結果をダウンロードして保存できませんでした。 | Retry. | はい |
model_unavailable | model_unavailable | 生成処理中にモデル自体またはそのモードの提供が停止しました。 | 別のモデルを選ぶか、時間をおいて再試行してください。 | いいえ — 先に内容を変更 |
canceled | upstream_error | 生成が完了する前に、処理側でジョブがキャンセルまたは期限切れになりました。(お客様自身がキャンセルした生成のステータスはcanceledで、エラーはありません。) | Retry. | はい |
generation_failed | generation_failed | モデルが結果を返さずに停止し、理由も通知されませんでした。 | 一度だけ再試行してください。再度失敗した場合は、プロンプトや入力を簡潔にするか、別のモデルをお試しください。 | はい |
リクエストに起因する失敗 — content_blocked、invalid_inputで拒否されたファイル、input_unreachable — は別の提供元でも同じように拒否されるため、他社では再試行しません。障害や提供元のエラーでは、同じ料金で利用可能なルートを順に試します。詳しくは失敗と返金をご覧ください。
モデル提供元が入力ファイルをダウンロードできないと応答した場合、通常は当社側でダウンロードを試みます。ダウンロードできた場合は、当社がホストするコピーを使って、料金やお客様側の設定を変えずにジョブを再試行します。生成履歴には送信したURLが引き続き表示され、コピーは保持期間の保持期間に従って生成データとともに削除されます。そのため、input_unreachableは多くの場合、ファイルをまったくダウンロードできなかったことを意味します。サインインが必要、署名付きリンクの有効期限切れ、ファイルへ直接つながっていない、またはホスト側がリクエストを拒否した場合などです。画像は最大30 MB、動画は最大200 MB、音声は最大50 MBまでコピーします。これより大きいファイルや読み取れないファイルはinvalid_inputとして失敗します。
安全に再試行する#
429、500、502、503は指数バックオフとジッターを使って再試行してください。ほかの4xxエラーはそのまま再送しないでください。同じ理由で再び失敗します。
送信は冪等ではありません
成功したPOST /run/{endpoint}はそれぞれ新しい生成を作成し、課金します。送信がネットワークタイムアウトし、受け付けられたか不明な場合は、再送する前に最近の生成履歴を確認してください。
const RETRYABLE = new Set([429, 500, 502, 503]);
export async function postWithRetry(url, headers, body, attempts = 5) {
let resp;
for (let attempt = 0; attempt < attempts; attempt++) {
resp = await fetch(url, { method: "POST", headers, body: JSON.stringify(body) });
if (!RETRYABLE.has(resp.status)) break;
// exponential backoff with jitter: ~1s, 2s, 4s, 8s…
await new Promise((r) => setTimeout(r, Math.min(2 ** attempt, 30) * 1000 + Math.random() * 1000));
}
const data = await resp.json();
if (!resp.ok) throw new Error(`${resp.status} ${data.error.code}: ${data.error.message}`);
return data;
}入力検証の例#
入力検証のメッセージには、フィールド名と許可値が示されます。そのまま開発者に表示できます:
[
{
"error": {
"code": "invalid_request",
"message": "\"prompt\" is required",
"param": "prompt"
}
},
{
"error": {
"code": "invalid_request",
"message": "Unknown parameter \"resoluton\"",
"param": "resoluton"
}
},
{
"error": {
"code": "not_found",
"message": "Unknown endpoint \"bytedance/seedance-2.0-fast/text-to-gif\". See GET /api/v1/models."
}
}
]実行せずにリクエストの料金を確認する方法もあります:POST /api/v1/quote/{endpoint}は料金に関わる項目を検証して料金を返します。詳しくはAPIリファレンスをご覧ください。
不明な点や不足している情報がありますか?support@cheapergen.com — すべて目を通しています。