新規登録でプレミアムプランが割引に割引を受け取る
eroq

ブログ/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 Google 124 約25秒
Nano Banana 2.1 nano-banana-2-1 Google 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つ送ってみましょう。

タグimage-apigpt-imagenano-bananaseedreamflux-3async

eroqで作る

APIで組み込む

APIキーは1分で発行できます。同じエンジン、同じ価格、非同期ジョブとWebhook。

40クレジット無料 · カード不要 · 全アカウントでプライベートモード