ブログ/developers·2026年10月8日·3分·執筆:eroqチーム
GPT Image・Nano Banana・Seedream API:1つのエンドポイント
GPT Image 2.5、Nano Banana Pro、Seedream 5.0 Pro、Flux 3をeroqの1エンドポイントで呼び出す方法を、curlとJSで解説します。
画像生成モデルが5社あれば、たいていSDKも5つ、キーも5つ、請求ダッシュボードも5つ、そして「非同期」の定義も5通りになります。eroqなら、エンドポイントは1つで、変わるのはmodelだけです。OpenAIのGPT Image 2.5、GoogleのNano Banana、ByteDanceのSeedream、Black Forest LabsのFlux 3、xAIのGrok Imagine 2.0は、すべてPOST /v1/images/generationsを通り、同じボディ、同じ非同期の仕組み、1テイクあたり定額のクレジット価格で動きます。スタジオと同じエンジン、価格、ポリシーです。リファレンスは/docs/imagesにあり、この記事はその実践版です。
モデルID
| モデル | model ID |
提供元 | 1テイクのクレジット | 標準的なレンダリング時間 |
|---|---|---|---|---|
| GPT Image 2.5 Sunburst | gpt-image-2-5-sunburst |
OpenAI | 31 | 約15秒 |
| GPT Image 2.5 Flare | gpt-image-2-5-flare |
OpenAI | 31 | 約15秒 |
| Nano Banana Pro | nano-banana-pro |
124 | 約25秒 | |
| Nano Banana 2.1 | nano-banana-2-1 |
31 | 約8秒 | |
| Seedream 5.0 Pro | seedream-5-0-pro |
ByteDance | 36 | 約20秒 |
| Flux 3 Image | flux-3-image |
Black Forest Labs | 32 | 約20秒 |
| Grok Imagine 2.0 | grok-imagine-2-0 |
xAI | 32 | 約15秒 |
どのモデルも、5つのフォーマットすべてで同じ価格です。Flux 3 ImageとGrok Imagine 2.0はHobbyプランから、残りの5つはCreatorから使えます。それ未満のプランでは、呼び出しは403 plan_requiredを返し、課金されません。
レンダリングを送信する
curl https://eroq.ai/v1/images/generations \
-H "Authorization: Bearer $EROQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-pro",
"prompt": "An aerial view of a harbour city at blue hour, lit windows and light trails along the quays, layered haze between the towers, crisp architectural detail, cinematic wide shot",
"aspect": "16:9",
"batch": 2
}'
呼び出しはバッチ分を課金し、すぐに202を返します。ジョブはテイクごとに1つです。
{
"object": "image.generation",
"jobs": [
{ "id": "b7e6c2d4-…", "poll": "/v1/images/generations/b7e6c2d4-…" },
{ "id": "4f19a0e3-…", "poll": "/v1/images/generations/4f19a0e3-…" }
],
"created": 1791450000,
"model": "nano-banana-pro",
"failed": 0,
"usage": { "credits_spent": 248, "credits_remaining": 752 }
}
これらのエンジンで重要なフィールドは次のとおりです。
model:必ず指定してください。省略するとeroq-uncensoredになります。未知のIDは、有効なIDの一覧とともに400 invalid_bodyを返します。prompt:依頼内容のすべて。文字はダブルクォーテーションで囲みます。aspect:1:1(デフォルト)、3:4、4:3、9:16、16:9。ネイティブでレンダリングされます。batch:1〜4テイク、前払いで課金されます。failedは開始できなかったテイクの数で、返金済みです。store:恒久的な公開URLが必要ならtrue。開始した10 MBごとに2クレジットが追加されます。folder_id:レンダリングをライブラリのフォルダに直接入れます。
これらのエンジンが無視するもの
上のエンジンはテキストから画像のみで、一部のフィールドは効果がありません。
referencesは破棄されます。写真に合わせる必要がある顔や商品には、eroq-one(最大10枚)かeroq-krea2(最大4枚)にリクエストを送ってください。negative_promptとcfg_scaleは検証を通りますが、これらのエンジンでは使われません。望む結果をプロンプトで描写してください。edit: trueは400 edit_unsupported、aspect: "retain"は400 retain_requires_referenceを返します。どちらも画像操作なので、Eroq Oneに回してください。
ジョブが終わるまでポーリングする
const BASE = 'https://eroq.ai/v1'
const headers = {
Authorization: `Bearer ${process.env.EROQ_API_KEY}`,
'Content-Type': 'application/json',
}
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
export async function generate(body) {
const res = await fetch(`${BASE}/images/generations`, { method: 'POST', headers, body: JSON.stringify(body) })
const json = await res.json()
if (!res.ok) throw Object.assign(new Error(json.error.message), { status: res.status, code: json.error.code })
// One job per take: each succeeds, or fails and refunds, on its own
return Promise.all(json.jobs.map(job => waitFor(job.id)))
}
async function waitFor(id, { every = 2500, timeout = 11 * 60_000 } = {}) {
const started = Date.now()
while (Date.now() - started < timeout) {
const res = await fetch(`${BASE}/images/generations/${id}`, { headers })
const job = await res.json()
if (!res.ok) return { id, error: job.error?.code ?? `http_${res.status}` }
if (job.status === 'succeeded') {
const [image] = job.data
return { id, url: image.url, libraryId: image.library_id, ms: job.generation_ms }
}
if (job.status === 'failed') return { id, error: job.error.code } // credits already back
await sleep(every) // processing: phase is "queued" or "generating"
}
return { id, error: 'client_timeout' }
}
ポーリングは無料で、数秒おきが想定された間隔です。statusがsucceededかfailedになるまで続けてください。image.generation.succeededとimage.generation.failedのWebhookは、置き換えではなく上乗せの通知です。署名の検証方法は非同期APIガイドで紹介しています。
成功すると、data[0].urlは30分間有効な署名付きURLになります。ジョブIDは24時間残り、ジョブ(またはlibrary_idによる作品)を再取得すると新しいURLが発行されます。ユーザーに変わらないアドレスが必要なら、store: trueを指定してください。generation_msはレンダリングの実測時間です。サーバー側の10分の期限を過ぎても処理中のジョブはgeneration_timeoutで失敗として返金されます。上のクライアント側タイムアウトがそのすぐ後ろに置かれているのはそのためです。
バッチを手短に
バッチは、1回の呼び出し、1つのプロンプト、最大4テイクです。各テイクは独立したジョブなので、並列でポーリングして、いちばん良いものを残しましょう。失敗したテイクは、ほかに影響せず自動で返金されます。また、バッチは毎分のレート制限では1回の呼び出しとして数えられます。4つの異なるプロンプトなら、4回呼び出してください。
エラー
| ステータス | code |
何が起きたか | 対処 |
|---|---|---|---|
| 400 | invalid_body |
フィールドが検証に失敗した | ボディを修正。メッセージにフィールド名が出ます |
| 400 | content_blocked |
利用ポリシーにより、課金前に拒否された | プロンプトを変更し、そのまま再試行しない |
| 400 | edit_unsupported |
テキスト専用のエンジンに画像操作を送った | eroq-oneを使う |
| 402 | insufficient_credits |
残高が価格×バッチ数に満たない | チャージする。ループで再試行しない |
| 403 | plan_required |
モデルに上位プランが必要。課金前 | アップグレードするか、プランに含まれるモデルを選ぶ |
| 429 | rate_limit_exceeded |
このキーで今分の呼び出しが多すぎる | Retry-Afterの分だけ待つ |
| 502 | generation_failed |
レンダリングを開始できなかった | 課金なし。再試行する |
| 503 | model_unavailable |
このデプロイでエンジンがオフライン | 課金なし。別のIDを選ぶ |
| 404 | not_found |
未知のジョブID、または24時間より古い | IDと画像は早めに保存する |
failedで終わったジョブには、error.codeとしてcontent_blocked(プロバイダーが拒否)、generation_failed、generation_timeoutのいずれかが入り、クレジットはすでにウォレットに戻っています。プランはすべてのキーの毎分の上限を引き上げます。Creatorで2倍、Studioで4倍です。
用途でルーティングする
const ENGINE = {
text: 'gpt-image-2-5-sunburst', // posters, packaging, UI mockups
keyArt: 'gpt-image-2-5-flare', // dramatic, cinematic frames
detail: 'seedream-5-0-pro', // texture, architecture, landscapes
hero: 'nano-banana-pro', // the final frame, top fidelity
draft: 'nano-banana-2-1', // fast iteration
explore: 'grok-imagine-2-0', // many directions, characterful
daylight: 'flux-3-image', // natural light and typography
}
model: "auto"を指定すると、eroqのルーターがプランで使えるエンジンから選び、選ばれたモデルの分が課金されます。選ばれたモデルはmodelで返されます。124クレジット / 枚のNano Banana Proが選ばれることもあるので、コストが重要なときはモデルを明示してください。テイクごとの計算は2026年のAI画像の料金に、ルーティングの考え方は2026年のベストAI画像モデルにあります。
MCPとCLI
同じモデルは、MCPサーバーのgenerate_imageツール(レンダリングを待って画像を返し、時間のかかるものにはget_image_statusがあります)と、CLIの裏でも動いています。CLIではeroq image "a foggy harbour at dawn" -m seedream-5-0-pro --aspect 16:9 -o harbour.webpのように使います。どちらのセットアップも/docs/mcpにあります。
よくある質問
OpenAI、Google、ByteDanceのAPIキーは必要ですか?
いいえ。eroqのキー1つですべてのモデルをカバーでき、料金はすべて1つのウォレットからeroqのクレジットで課金されます。
eroq経由でNano Banana ProやGPT Image 2.5に参照画像を送れますか?
いいえ。eroqではどちらもテキストから画像のエンジンで、参照は破棄されます。画像を起点にする作業には、最大10枚の参照を読み込み、指示で編集できるeroq-oneを使ってください。
画像のURLはどのくらい有効ですか?
dataの署名付きURLは30分、ジョブは24時間です。再取得すれば新しいURLが得られ、恒久的な公開URLが必要ならstore: trueで送信してください。
失敗またはブロックされたレンダリングでクレジットは消費されますか?
いいえ。ポリシーで拒否されたプロンプトは課金前に応答され、失敗した、またはプロバイダー側で拒否されたジョブは自動で返金されます。
キーを入手し、モデルIDを選んで、/docs/imagesにリクエストを1つ送ってみましょう。
