ナビゲーションにスキップ

Nano Banana 2 Standard

テキストと最大 14 枚の参照画像から、1K・2K・4K の画像を生成または編集します。生成ごとに実際に使ったトークンで課金されます。

  • トークン課金です。入力、テキストと思考の出力、画像出力のトークンを、それぞれ 100 万トークンあたりの単価で計算します。下の 1 枚あたりの価格は、各 resolution に記載された画像トークン数での見積もりです。
  • 非同期のみです。POST /v1/images/tasks でタスクを作成し、GET /v1/tasks/{task_id} をポーリングします。生成は BeatAPI 側で行うため、時間のかかる生成でも接続を占有しません。このモデルでは同期の POST /v1/images/generations は使えません。
  • 1 タスクにつき画像は 1 枚です。複数枚が必要な場合は、複数のタスクを作成してください。
  • テキストから画像を生成するほか、公開 HTTPS リンクで指定した最大 14 枚の参照画像を編集・合成できます。
  • 失敗したタスクには課金されません。仮確保された金額は全額戻されます。

これはトークン課金で提供する nano-banana-2 です。モデルとリクエストは同じで、フィールド、解像度、アスペクト比、参照画像もすべて共通です。nano-banana-2 は画像 1 枚ごとの固定価格、nano-banana-2-std は生成ごとに実際に使ったトークンに対する課金です。料金を見る。

POST/v1/images/tasks試してみる

このモデルをテスト画面で開きます。BeatAPI の API キーを入力するとタスクを作成できます。実際に呼び出され、ご自身の残高から課金されます。

モデル ID

固定価格のモデルとこのモデルは同じリクエストを受け付けます。違うのは価格の数え方だけです。下の値はゲートウェイの契約からそのまま取っています。

モデル IDresolutionimages の最大数output_format価格
nano-banana-21K, 2K, 4K14png, jpegresolution ごとに画像 1 枚あたりの固定価格です。
nano-banana-2-std1K, 2K, 4K14png, jpeg生成で使ったトークンを 100 万トークンあたりの単価で課金します。

エンドポイントと認証

POST https://api.beatapi.io/v1/images/tasks

Authorization string 必須

BeatAPI の API キーを Bearer <BEATAPI_API_KEY> の形式で送信します。キーはダッシュボードで作成できます。キーはサーバー側で保管し、ブラウザーやモバイルアプリに含めないでください。

ボディは JSON で送信し、Content-Type: application/json を指定します。Idempotency-Key は任意です。論理的に 1 件のリクエストごとに一意の値(255 文字以内)を送り、まったく同じボディを再試行するときだけ再利用してください。24 時間以内に同じキーと同じボディで再試行すると、最初のレスポンスが Idempotent-Replayed: true 付きで再度返されます。同じキーで異なるボディを送ると 409 idempotency_conflict が返ります。2xx 以外のレスポンスは保存されないため、400 や 402 の後の再試行は改めて実行されます。

リクエストの流れ

1

タスクを作成する

下記のパラメーターをエンドポイントに POST します。201 が返れば、タスクが受け付けられ、料金が残高から仮確保されたことを意味します。処理はバックグラウンドで実行されます。data.id を保存してください。

2

完了を待つ

GET /v1/tasks/{task_id} を呼び出し、status が succeeded または failed になるまで、呼び出しの間隔を data.poll_after_seconds(画像は 5 秒、動画は 8 秒)だけ空けてください。あるいは task.succeeded と task.failed のWebhookを登録することもできます。処理タイムアウトで停止したタスクはイベントを送信しないため、フォールバックとしてポーリングも続けてください。

3

結果を保存する

succeeded の場合は、すべての data.output.media[].url をダウンロードし、必要なファイルを保存してください。結果 URL がいつまで利用できるかは保証されません。failed の場合は、data.error_code と data.error_message を確認してください。仮確保された金額は残高に戻されます。data.retryable は、同じリクエストをもう一度送れば成功する可能性があるかどうかを示します。

入力モード

モード必須の入力備考
テキストから画像model、promptimages は省略してください。
画像の編集・合成model、prompt、images公開 HTTPS の画像リンクを 1~14 個指定します。変更・維持・合成したい内容を prompt に記述してください。

リクエストパラメーター

model string 必須

実行するモデルです。

値:nano-banana-2-std

値が正しくない場合

  • 指定がない場合:"model" is required
  • 不明なモデル ID の場合:"model" nano-banana-9 is not catalogued
  • 動画モデルをこのエンドポイントに送った場合:"model" seedance-2.5 is served by POST /v1/videos/tasks, not this endpoint

prompt string 必須

描きたい内容、または参照画像に加えたい変更です。被写体、スタイル、照明、構図、画像内に表示したい文字などを、普通の言葉で書くのが最適です。

長さ:1–5000 文字

  • 長さは文字数で数えます(CJK 文字も 1 文字として数えます)。
  • images を送る場合は、どの画像が何の役割かを書いてください。たとえば「1 枚目の画像を商品に、2 枚目の画像を背景に使う」のように指定します。

値が正しくない場合

  • 指定がない場合:"prompt" is required
  • 空、または上限を超える長さの場合:"prompt" has an unsupported length
  • 文字列でない場合:"prompt" must be a string

images string[] 任意

編集または合成する参照画像です。このフィールドを送ると、リクエストはテキストからの画像生成ではなく、画像編集として扱われます。

要素数:1–14
各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • 各リンクは、公開 HTTPS で画像ファイルそのもの(PNG、JPEG、WebP)を返し、サイズが 50 MB 以下である必要があります。ゲートウェイは、タスクを作成する前に、すべてのリンクの先頭バイトをダウンロードして確認します。
  • Web ページ、ログインが必要なページ、期限切れの署名付き URL、ホットリンク保護のあるホストへのリンクは、画像を返さないため拒否されます。
  • エラーメッセージ中の位置は 0 始まりです。images[0] は 1 番目のリンクを指します。

値が正しくない場合

  • 最大数を超えた場合:"images" accepts at most 14 items
  • 空の配列の場合:"images" requires at least 1 item
  • https:// のリンクでない場合:"images[0]" must be a public HTTPS URL
  • プライベートまたは安全でないアドレスの場合:"images[0]" must be a publicly reachable HTTPS image URL
  • ホストが 4xx エラーを返した場合:"images[0]" could not be downloaded: the URL returned HTTP 404
  • リンクが PNG、JPEG、WebP 以外を返した場合:"images[0]" is not a PNG, JPEG or WebP image: the URL returned text/html
  • 50 MB を超える場合:"images[2]" is 63.4 MB; images must be 50 MB or smaller

例

"images": [
"https://cdn.beatapi.io/samples/smart-bottle.png",
"https://cdn.beatapi.io/samples/neon-singer.png"
]

aspect_ratio string 任意デフォルト: 1:1

画像の形を「幅:高さ」で指定します。

指定できる値:1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto
デフォルト:1:1

  • auto を指定すると、形はモデルに任されます。images がある場合は通常、参照画像に沿いますが、すべての経路で保証されるわけではありません。形が重要な場合は、比率を指定してください。
  • 1:4、4:1、1:8、8:1 は、極端に縦長・横長のバナー向けです。Nano Banana Pro と Nano Banana は対応していません。

画像を編集するときは、auto を指定すると通常は参照画像の形が維持されます。フィールドを省略すると、デフォルトの 1:1 が使われ、結果は正方形になります。

値が正しくない場合

  • 一覧にない値の場合:"aspect_ratio" must be one of: [1:1 1:4 1:8 2:3 3:2 3:4 4:1 4:3 4:5 5:4 8:1 9:16 16:9 21:9 auto]

resolution string 任意デフォルト: 1K

画像のサイズ区分です。区分が高いほど画像は大きくなり、料金も上がります。正確なピクセルサイズは aspect_ratio に依存し、モデルが決定します。

指定できる値:1K, 2K, 4K
デフォルト:1K

  • 大文字の K を使ってください。2k は拒否されます。

値が正しくない場合

  • 一覧にない値の場合:"resolution" must be one of: [1K 2K 4K]

output_format string 任意デフォルト: png

結果のファイル形式です。

指定できる値:png, jpeg
デフォルト:png

  • モデルが 2 つの形式のうち、指定と異なる方で返した場合、BeatAPI は保存前に画像を変換するため、ファイルは通常、指定した形式になります。変換に失敗した場合は、受け取ったままの形式で保存されます。透明な部分は JPEG では白になります。変換できないほど大きい画像(64 メガピクセル超)は、受け取ったままの形式で保存されます。output.media[].mime_type には、常に実際に保存された形式が示されます。
  • jpg ではなく jpeg と書いてください(jpg を使うのは Nano Banana Pro のみです)。

値が正しくない場合

  • 一覧にない値の場合(たとえば jpg や webp):"output_format" must be one of: [png jpeg]

ゲートウェイはタスク作成前に、次の組み合わせも確認します。

  • 生成ごとに実際に使ったトークン数(入力、テキストと思考の出力、画像出力)を表示価格の単価で課金します。記載の 1 枚あたりの価格は、各解像度に記載された画像トークン数での見積もりです。
  • これは公式版で、トークン課金です。nano-banana-2 は同じモデルを 1 枚固定料金で提供します。

入力メディアの上限

ゲートウェイはタスク作成前にすべての入力を読み取り、次の上限を超えるものは、その入力を示す 400 bad_request で拒否します。課金はされません。

  • 参照画像:PNG、JPEG、WebP。ファイル名や Content-Type ではなく、ファイルの内容から判定されます。1 件あたり 50 MB 以下(10 進の MB。ホストがサイズを申告した場合に確認されます)で、リンクは 1~14 個です。GIF、HEIC、SVG は拒否されます。
  • このモデルでは、ピクセル数やアスペクト比の上限は確認されません。
  • ホストが時間内に応答しない場合、そのリンクは作成時には拒否されません。後で取得できないままのリンクがあると、タスクは bad_request で失敗し、返金されます。
  • ローカルファイルは POST /v1/files でアップロードし、返された data.url を指定してください。

送信してからポーリングする

このモデルはタスクとしてのみ動きます。POST /v1/images/tasks はすぐに応答し、タスク ID は data.id に入ります。その後 data.poll_after_seconds ごとに GET /v1/tasks/{task_id} を呼び、data.status が succeeded または failed になるまで待ちます。生成は BeatAPI 側で行うため、時間のかかる生成でも接続を占有せず、クライアントのタイムアウトにもかかりません。このモデルでは同期の POST /v1/images/generations は使えません。

Submit, then poll
# 1. Create the task. The call returns at once; the task ID is in data.id.
TASK_ID=$(curl -sS -X POST https://api.beatapi.io/v1/images/tasks \
-H "Authorization: Bearer $BEATAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"nano-banana-2-std","prompt":"A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field","resolution":"2K"}' | jq -r '.data.id')
# 2. Poll until the task is final. The render runs on BeatAPI, not on this connection.
while true; do
TASK=$(curl -sS "https://api.beatapi.io/v1/tasks/$TASK_ID" -H "Authorization: Bearer $BEATAPI_API_KEY")
STATUS=$(echo "$TASK" | jq -r '.data.status')
if [ "$STATUS" = "succeeded" ] || [ "$STATUS" = "failed" ]; then break; fi
sleep 5
done
echo "$TASK" | jq '.data.output.media[].url, .data.usage'

Capabilities API から呼んでも同じタスクです。POST /v1/capabilities/run で開始し、返されたタスク ID でステータスの呼び出しを succeeded または failed になるまで送ります。

POST /v1/capabilities/run
{"reference":"model:nano-banana-2-std","input":{"model":"nano-banana-2-std","prompt":"A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field","resolution":"2K"}}
POST /v1/capabilities/run (status)
{"reference":"model:nano-banana-2-std","operation":"status","task_id":"<task_id>"}

トークン課金と固定価格の比較

nano-banana-2-stdnano-banana-2
価格生成で使ったトークン(下の 100 万トークンあたりの単価)resolution ごとに 1 枚あたりの固定価格
タスク作成時に予約される額その区分の 1 枚あたりの見積もりその画像の価格
タスク成功時の請求実際に使ったトークンで精算。data.usage は予約額と異なることがあります予約した価格
フィールド、解像度、アスペクト比、参照画像同じ同じ
失敗したタスク無料無料

このモデルが受け付けないフィールド

画像エンドポイントは、他の画像モデルが使ういくつかのフィールドを認識します。ここでそれらを送ると、無視されずに拒否されます。そのため、効果のなかった設定に対して料金を支払うことはありません。

  • quality、seed、background、size、enhance_prompt → field "quality" is not supported by model nano-banana-2-std(送信したフィールド名が入ります)。
  • それ以外の未知のフィールド(たとえば n)→ unknown field: n。n はありません。1 タスクで作られる画像は 1 枚です。

リクエスト例

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-2-std",
"prompt": "A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field",
"aspect_ratio": "16:9",
"resolution": "2K"
}'

テキストから画像

プロンプトから、2K の横長画像を生成します。

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-2-std",
"prompt": "A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field",
"aspect_ratio": "16:9",
"resolution": "2K"
}'

1 枚の画像を編集

商品はそのままに、背景を変更します。auto を指定すると、通常は参照画像の形が維持されます。

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-2-std",
"prompt": "Keep the bottle exactly as it is. Replace the background with a sunlit kitchen counter and add a soft reflection under the bottle.",
"images": [
"https://cdn.beatapi.io/samples/smart-bottle.png"
],
"aspect_ratio": "auto"
}'

複数の画像を合成

プロンプトでは、各参照画像を位置で指定します。

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-2-std",
"prompt": "Place the bottle from the first image on a neon-lit stage like the one in the second image. Keep the bottle label readable.",
"images": [
"https://cdn.beatapi.io/samples/smart-bottle.png",
"https://cdn.beatapi.io/samples/neon-singer.png"
],
"aspect_ratio": "1:1",
"resolution": "1K"
}'

4K JPEG ポスター

縦長のポスターを JPEG で受け取ります。

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-2-std",
"prompt": "A retro travel poster of a coastal city at sunset, bold flat colours, large title text \"SEASIDE\" at the top",
"aspect_ratio": "9:16",
"resolution": "4K",
"output_format": "jpeg"
}'

レスポンス

タスクの作成(201)

タスクオブジェクトです。タスクが成功するまで output は null です。「実行中」と記載されたフィールドは、タスクの完了後に表示されなくなります。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "nano-banana-2-std",
"capability_version": 1,
"media_type": "image",
"model": "nano-banana-2-std",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 5,
"output": null,
"usage": {
"credits_reserved": 0.05544,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 0.05544
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
フィールド型説明
data.idstringタスク ID です。task_ の後に英数字 32 文字が続きます。ポーリングや Webhook イベントとの照合に使います。
data.objectstring常に task です。
data.task_kindstringimage または video です。
data.capability_idstring送信したモデル ID です。
data.capability_versionintegerモデルの仕様バージョンです。現在は 1 です。
data.media_typestringimage または video です。
data.modelstring送信したモデル ID です(capability_id と同じ)。
data.statusstringqueued、processing、succeeded、failed のいずれかです。最終状態は後ろの 2 つだけです。
data.stagestringstatus と同じ値です。古いクライアント向けに残されています。
data.created_atintegerタスクの作成日時(Unix 秒)です。
data.updated_atinteger最終更新日時(Unix 秒)です。
data.completed_atinteger | nullタスクの完了日時(Unix 秒)です。実行中は null です。
data.poll_after_secondsinteger実行中のみ。次のポーリングまでに待つ秒数です(画像は 5、動画は 8)。
data.typical_secondsobject実行中のみ、直近のタスクが十分にある場合に含まれます。直近 window の samples 件のタスクについて、完了までの時間(秒)の p50 と p90 を示します。
data.outputobject | null結果です。status が succeeded になるまでは null です。下の出力フィールドを参照してください。
data.usage.credits_reservednumberタスク作成時に残高から仮確保された金額(USD)です。
data.usage.credits_chargednumberこのタスクの料金(USD)です。失敗したタスクでは 0 です。
data.usage.credits_settlednumber最終的に差し引かれた金額(USD)です。タスクが成功した時点で設定され、それ以外では 0 です。
data.usage.credits_refundednumber残高に戻された金額(USD)です。失敗したタスクでは、返金が記録された時点で仮確保した金額と一致します。
data.usage.billable_duration_secondsinteger動画のみ。料金の算定に使われた秒数です。モデルが長さを報告しない場合は含まれません。
data.request_idstringリクエスト ID です。サポートに問い合わせる際に添えてください。
data.error_codestring | null失敗コードです。タスクが失敗した場合以外は null です。
data.error_messagestring | null何が問題で、何を変更すればよいかを示します。タスクが失敗した場合以外は null です。

完了したタスク

GET /v1/tasks/{task_id} は HTTP 200 と status: "succeeded" を返し、結果は data.output に入ります。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "nano-banana-2-std",
"capability_version": 1,
"media_type": "image",
"model": "nano-banana-2-std",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "image",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.png",
"mime_type": "image/png"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.png"
},
"usage": {
"credits_reserved": 0.05544,
"credits_settled": 0.05544,
"credits_refunded": 0,
"credits_charged": 0.05544
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

出力フィールド

フィールド型説明
output.mediaobject[]生成されたファイルです。このモデルでは 1 件です。
output.media[].typestring常に image です。
output.media[].urlstring保存された画像への HTTPS リンクです。ダウンロードして保管してください。保持期間は保証されません。
output.media[].mime_typestring実際に保存されたファイルの形式です。通常は output_format で指定したとおりの image/png または image/jpeg です。
output.r2_urlstring1 件目の media の URL と同じ値です。古いクライアント向けです。代わりに media を読んでください。

失敗したタスク

失敗したタスクも、GET /v1/tasks/{task_id} では HTTP 200 になります。失敗はボディに示されます。仮確保された金額は全額戻されるため、課金されません。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "nano-banana-2-std",
"capability_version": 1,
"media_type": "image",
"model": "nano-banana-2-std",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 0.05544,
"credits_settled": 0,
"credits_refunded": 0.05544,
"credits_charged": 0
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
フィールド型説明
data.error_codestringbad_request と content_policy_violation(リクエストを修正してください)、または processing_unavailable、processing_timeout、processing_failed、result_transfer_failed(時間をおいて再試行してください)のいずれかです。エラーを参照してください。
data.error_messagestring問題と対処方法を示す文です。
data.retryableboolean失敗したタスクにのみ含まれます。同じリクエストをもう一度送れば成功する可能性がある場合は true です。
data.usageobject返金が記録された時点(通常はタスクが失敗した瞬間)で、credits_charged と credits_settled は 0 になり、credits_refunded は credits_reserved と一致します。

完全なコード例

タスクを作成し、サーバーが示すポーリング間隔で完了を待ち、結果の URL を出力します。環境変数に BEATAPI_API_KEY を設定し、requests をインストールしてください。

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/images/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "nano-banana-2-std",
"prompt": "A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field",
"aspect_ratio": "16:9",
"resolution": "2K"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

課金

  • トークン課金です。単価は下の表(100 万トークンあたり)のとおりで、入力(プロンプトと images の参照画像)、テキストと思考の出力、画像出力に分かれます。トークン数はモデルが数え、resolution と参照画像が数を変えます。
  • 1 枚あたりの価格は、各 resolution で 1 回生成したときに記載されている画像出力トークン数を使い、参照画像なしで見積もったものです。参照画像と思考の分が加わります。
  • タスクの作成時に、その区分の見積もりが残高(キーに上限がある場合はその枠)から予約されます。成功すると、生成で実際に使ったトークンで精算されるため、最終的な data.usage は予約額と異なることがあります。タスクができる前に拒否されたリクエストには料金がかかりません。
  • 失敗したタスクは全額返金されます。
  • 固定価格の nano-banana-2 は同じモデルで、生成に何トークン使っても画像 1 枚ごとに一定の価格です。

現在の定価です。料金ページと同じ金額です。割引を個別に契約しているアカウントでは、より低い金額になります。実際に課金された金額は、タスクの data.usage で確認できます。

オプション定価(USD)
1 枚 · 1K · 記載の画像トークン数での見積もり$0.03696
1 枚 · 2K · 記載の画像トークン数での見積もり$0.05544
1 枚 · 4K · 記載の画像トークン数での見積もり$0.08316
入力 · 100万トークンあたり$0.275
テキストと思考の出力 · 100万トークンあたり$1.65
画像出力 · 100万トークンあたり$33

よくあるエラー

エラーまたは症状原因対処
400 "resolution" must be one of: [1K 2K 4K]小文字の 2k や、2048x2048 のようなピクセルサイズを送っています。1K、2K、4K のいずれかを送ってください。
400 "output_format" must be one of: [png jpeg]Nano Banana 2 に jpg や webp を送っています。jpeg を送ってください(jpg を受け付けるのは Nano Banana Pro のみです)。
400 unknown field: n1 つのタスクで複数枚の画像を要求しています。n を削除し、画像 1 枚ごとにタスクを作成してください。
400 field "seed" is not supported by model nano-banana-2-std他の画像モデルのフィールド(seed、quality、size、background、enhance_prompt)を送っています。そのフィールドを削除してください。
400 "images[0]" must be a public HTTPS URLhttp:// のリンク、data: URI、またはローカルパスを指定しています。ファイルを HTTPS で公開するか、POST /v1/files でアップロードして data.url を使ってください。
400 "images[1]" is not a PNG, JPEG or WebP image: the URL returned text/htmlリンク先がファイルではなく、Web ページ、ログインページ、または期限切れの署名付き URL です。画像ファイルへ直接リンクしてください。
400 "images[0]" could not be downloaded: the URL returned HTTP 403ホストがサーバーからのダウンロードをブロックしています(ホットリンク保護、またはプライベートなバケット)。ファイルを公開するか、POST /v1/files でアップロードしてください。
編集した画像が正方形で返ってくるaspect_ratio を省略したため、デフォルトの 1:1 が使われました。希望の比率を指定してください。auto を指定すると、通常は参照画像の形が維持されます。
タスクが content_policy_violation で failedプロンプト、参照画像、または生成された画像がモデレーションで拒否されました。実在の人物が写っている画像は拒否されることがあります。プロンプトまたは画像を変更してください。そのまま再試行しても再び失敗します。課金はされません。
タスクが processing_timeout で failed画像が処理時間の上限内に完了しませんでした。再試行してください。失敗したタスクは返金されています。
チャージしたことのないアカウントでの 403 forbidden無料クレジットは一部のモデルにのみ使えます。一度チャージするか、無料クレジットで使えるモデルを使ってください。
404 POST /v1/images/generationsこのモデルは非同期タスクとしてのみ提供され、同期エンドポイントは使えません。POST /v1/images/tasks でタスクを作成し、GET /v1/tasks/{task_id} をポーリングしてください。
請求額が 1 枚あたりの価格と違う請求は生成で使ったトークンで精算されます。1 枚あたりの価格は見積もりです。完了したタスクの data.usage を確認してください。

HTTP エラー早見表

タスクが作られる前のエラーは、2xx 以外のレスポンスで返されます。課金はされません。error.code または error.retryable で処理を分岐してください。message には問題の内容が示されます。全一覧と再試行のルールはエラーにあります。

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP ステータスerror.code対処方法
400bad_request, content_policy_violationリクエストを修正してください。メッセージにフィールド名が示されます。そのまま再試行しないでください。
401missing_api_key, invalid_api_key(古いクライアントでは unauthorized が返ることがあります)有効なキーを Authorization: Bearer <key> で送信してください。
402insufficient_credits残高をチャージするか、キーのクォータを引き上げてから、再度送信してください。
403forbiddenこのキーまたはアカウントでは、このモデルを利用できない可能性があります(たとえば、無料クレジットは一部のモデルにのみ使えます)。そのまま再試行しないでください。
404not_foundGET /v1/tasks/{task_id} の場合:このキーのアカウントに該当するタスクが存在しません。ID を確認してください。
409idempotency_conflict新しい Idempotency-Key を使うか、同じキーの最初のリクエストが完了するまで待ってください。
429rate_limit_exceededRetry-After の秒数(error.retry_after_seconds にも含まれます)だけ待ってから再試行してください。
500internal_errorバックオフを入れて再試行してください。解消しない場合は、request_id を添えてサポートにお問い合わせください。
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failed課金はされていません。指数バックオフで再試行してください。

認証

AuthorizationBearer

API キーを Authorization: Bearer <BEATAPI_API_KEY> として送信してください。

ヘッダー

Idempotency-Keystringオプション<=255 characters

ボディは JSON で送信し、Content-Type: application/json を指定します。Idempotency-Key は任意です。論理的に 1 件のリクエストごとに一意の値(255 文字以内)を送り、まったく同じボディを再試行するときだけ再利用してください。24 時間以内に同じキーと同じボディで再試行すると、最初のレスポンスが Idempotent-Replayed: true 付きで再度返されます。同じキーで異なるボディを送ると 409 idempotency_conflict が返ります。2xx 以外のレスポンスは保存されないため、400 や 402 の後の再試行は改めて実行されます。

リクエスト

This endpoint expects an object.
modelenum必須

実行するモデルです。

値:nano-banana-2-std

値が正しくない場合

  • 指定がない場合:"model" is required
  • 不明なモデル ID の場合:"model" nano-banana-9 is not catalogued
  • 動画モデルをこのエンドポイントに送った場合:"model" seedance-2.5 is served by POST /v1/videos/tasks, not this endpoint
許可された値:
promptstring必須1-5000 characters

描きたい内容、または参照画像に加えたい変更です。被写体、スタイル、照明、構図、画像内に表示したい文字などを、普通の言葉で書くのが最適です。

長さ:1–5000 文字

  • 長さは文字数で数えます(CJK 文字も 1 文字として数えます)。
  • images を送る場合は、どの画像が何の役割かを書いてください。たとえば「1 枚目の画像を商品に、2 枚目の画像を背景に使う」のように指定します。

値が正しくない場合

  • 指定がない場合:"prompt" is required
  • 空、または上限を超える長さの場合:"prompt" has an unsupported length
  • 文字列でない場合:"prompt" must be a string
aspect_ratioenumオプションデフォルト値 1:1

画像の形を「幅:高さ」で指定します。

指定できる値:1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9, auto

デフォルト:1:1

  • auto を指定すると、形はモデルに任されます。images がある場合は通常、参照画像に沿いますが、すべての経路で保証されるわけではありません。形が重要な場合は、比率を指定してください。
  • 1:4、4:1、1:8、8:1 は、極端に縦長・横長のバナー向けです。Nano Banana Pro と Nano Banana は対応していません。

備考:画像を編集するときは、auto を指定すると通常は参照画像の形が維持されます。フィールドを省略すると、デフォルトの 1:1 が使われ、結果は正方形になります。

値が正しくない場合

  • 一覧にない値の場合:"aspect_ratio" must be one of: [1:1 1:4 1:8 2:3 3:2 3:4 4:1 4:3 4:5 5:4 8:1 9:16 16:9 21:9 auto]
imageslist of stringsオプション

編集または合成する参照画像です。このフィールドを送ると、リクエストはテキストからの画像生成ではなく、画像編集として扱われます。

要素数:1–14

各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • 各リンクは、公開 HTTPS で画像ファイルそのもの(PNG、JPEG、WebP)を返し、サイズが 50 MB 以下である必要があります。ゲートウェイは、タスクを作成する前に、すべてのリンクの先頭バイトをダウンロードして確認します。
  • Web ページ、ログインが必要なページ、期限切れの署名付き URL、ホットリンク保護のあるホストへのリンクは、画像を返さないため拒否されます。
  • エラーメッセージ中の位置は 0 始まりです。images[0] は 1 番目のリンクを指します。

値が正しくない場合

  • 最大数を超えた場合:"images" accepts at most 14 items
  • 空の配列の場合:"images" requires at least 1 item
  • https:// のリンクでない場合:"images[0]" must be a public HTTPS URL
  • プライベートまたは安全でないアドレスの場合:"images[0]" must be a publicly reachable HTTPS image URL
  • ホストが 4xx エラーを返した場合:"images[0]" could not be downloaded: the URL returned HTTP 404
  • リンクが PNG、JPEG、WebP 以外を返した場合:"images[0]" is not a PNG, JPEG or WebP image: the URL returned text/html
  • 50 MB を超える場合:"images[2]" is 63.4 MB; images must be 50 MB or smaller

例

"images": [
  "https://cdn.beatapi.io/samples/smart-bottle.png",
  "https://cdn.beatapi.io/samples/neon-singer.png"
]
output_formatenumオプションデフォルト値 png

結果のファイル形式です。

指定できる値:png, jpeg

デフォルト:png

  • モデルが 2 つの形式のうち、指定と異なる方で返した場合、BeatAPI は保存前に画像を変換するため、ファイルは通常、指定した形式になります。変換に失敗した場合は、受け取ったままの形式で保存されます。透明な部分は JPEG では白になります。変換できないほど大きい画像(64 メガピクセル超)は、受け取ったままの形式で保存されます。output.media[].mime_type には、常に実際に保存された形式が示されます。
  • jpg ではなく jpeg と書いてください(jpg を使うのは Nano Banana Pro のみです)。

値が正しくない場合

  • 一覧にない値の場合(たとえば jpg や webp):"output_format" must be one of: [png jpeg]
許可された値:
resolutionenumオプションデフォルト値 1K

画像のサイズ区分です。区分が高いほど画像は大きくなり、料金も上がります。正確なピクセルサイズは aspect_ratio に依存し、モデルが決定します。

指定できる値:1K, 2K, 4K

デフォルト:1K

  • 大文字の K を使ってください。2k は拒否されます。

値が正しくない場合

  • 一覧にない値の場合:"resolution" must be one of: [1K 2K 4K]
許可された値:

レスポンス

タスクオブジェクトです。タスクが成功するまで output は null です。「実行中」と記載されたフィールドは、タスクの完了後に表示されなくなります。

エラー

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error