Nano Banana
Nano Banana Pro and Flash limits, the four extreme aspect ratios, and the free relax lane.
Nano Banana is Google's image family on ListenHub: gemini-3-pro-image (Nano Banana Pro) for detail
and gemini-3.1-flash-image (Nano Banana Flash) for speed. Both run on the shared image endpoints.
For the endpoints, request schema, async flow, and error codes, see the
Image Generation overview. This page covers only
what is specific to Nano Banana.
Models
| Model | Display name | Best for |
|---|---|---|
gemini-3-pro-image | Nano Banana Pro | The most detailed output in the catalogue |
gemini-3.1-flash-image | Nano Banana Flash | Faster, cheaper generation, and the only Nano Banana tier that takes the extreme ratios |
Both take provider: "google". The preview IDs gemini-3-pro-image-preview and
gemini-3.1-flash-image-preview are still accepted and normalized to the GA IDs above.
Limits
| Limit | gemini-3-pro-image | gemini-3.1-flash-image |
|---|---|---|
| Image sizes | 1K, 2K, 4K | 1K, 2K, 4K |
| Aspect ratios | The 10 standard ratios | All 14, including the extreme four |
| Default aspect ratio | 1:1 (schema default) | 1:1 (schema default) |
| Reference images | Up to 14 | Up to 14 |
quality | Ignored | Ignored |
1:4, 4:1, 1:8, and 8:1 are Flash-only within this family — sending one to
gemini-3-pro-image returns 400 with code: 29003. Every ratio rejection on Nano Banana carries
29003, not the 26019 that GPT-Image and Wan 2.7 use.
Neither model declares a family-level reference-image cap, so the schema-wide maximum of 14 items is the effective limit — the highest in the catalogue.
The extreme ratios
Four ratios cover shapes the standard set cannot express — banners, vertical strips, and panoramas:
| Ratio | Shape | Typical use |
|---|---|---|
1:4 | Narrow portrait | Sidebar art, vertical strips |
4:1 | Wide landscape | Page banners, headers |
1:8 | Extreme portrait | Tall scrolling panels |
8:1 | Panoramic | Wide panoramas, footer strips |
Within Nano Banana they are Flash-only. Outside it, seedream-5-0-pro accepts them too — it is
validated on size rather than on ratio.
Free quota
Both models have their own free-quota resource, spendable at 1K and 2K only — a 4K request is
always billed in credits. How the quota is earned and read back is on the
overview.
| Model | Free-quota resource |
|---|---|
gemini-3-pro-image | gemini-3-pro-image-relax-1k-2k |
gemini-3.1-flash-image | gemini-3.1-flash-image |
The relax lane
gemini-3-pro-image is the only model in the catalogue whose free quota runs on a separate
execution lane. How it runs depends on your account type:
- Accounts that have ever paid (active subscription, recharge, or credit-pack purchase) keep full priority, normal capacity, and normal fallback while spending free quota — the quota changes billing, not the lane you run on.
- Pure-free accounts (never paid anything) run on a lowest-priority free lane with a fixed throughput cap. At peak times a request may be queued or rejected with a retryable busy/timeout response. When that happens, no credits are spent and the free quota is not consumed — retry later.
A pure-free relax failure returns machine-readable metadata so you can detect it without parsing localized text:
failReasonisfree_relax_busyorfree_relax_timeout.retryableistrue.freeUsageRolledBackistrueonce the free quota has been refunded.userMessagecarries friendly, localizable copy on the synchronous error body; the async task object exposes the same copy asfailUserMessage. The two surfaces use different field names — read both if you handle both paths.
For synchronous requests this appears in the error body; for async requests it appears on the failed task detail (and in the task list). Treat both reasons as "retry later, nothing was charged".
Pricing
Both models are priced at a fixed credit cost per image size (pricing.mode is fixed), and neither
ever sets requiresSubscription. 4K costs more than 2K, which costs more than 1K. Call
POST /v1/images/generation/estimate-credits
with the model and size for the exact figure rather than hardcoding it.
Example
curl -X POST "https://api.marswave.ai/openapi/v1/images/generation/async" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "google",
"model": "gemini-3.1-flash-image",
"prompt": "A panoramic mountain range at dawn, layered mist, muted palette",
"imageConfig": { "imageSize": "2K", "aspectRatio": "8:1" }
}'See the Image Generation overview for the full parameter list and the reference-image request shapes.