Nano Banana Pro API
Higher-fidelity generation for hero shots and print-sized crops, with 1K, 2K and 4K output — roughly twice the base price per image at 1K.
from 4 credits ≈ $0.05 per image
At a glance
- Model id
- nanobanana-pro
- Capability
- image.generate
- Resolutions
- 1K · 2K · 4K
- Aspect ratios
- auto, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 5:4, 4:5, 21:9
- Images per request
- 4
- Seed
- supported
- Reference images
- up to 14 per request
- Negative prompt
- supported
- Prompt length
- up to 2000 characters
Sample outputs
Unretouched outputs from this model, generated through the API.

ceramic coffee cup on a concrete table soft window light
Pricing
Cost = credits per image × n. Credits are reserved when you submit a job and refunded in full if it fails or you cancel it before it starts.
| Resolution | Credits / image | USD / image | USD for 4 images |
|---|---|---|---|
| 1K | 4 | $0.05 | $0.20 |
| 2K | 6 | $0.075 | $0.30 |
| 4K | 8 | $0.10 | $0.40 |
USD figures are converted at the Scale pack rate; larger packs are cheaper per credit. See pricing for the full pack list.
List prices elsewhere
Publicly listed per-image prices for comparable access to this model, read from each provider's own pricing page. Providers change prices without notice — follow the links for the current figure.
| Provider | List price per image | Checked on |
|---|---|---|
| Unified Image API (1K) 4 credits · at the Scale pack rate | $0.05 | live |
| PiAPI (Nano Banana Pro) Reseller list price, from. | $0.105 | 2026-08-30 |
| Google (Nano Banana Pro) List range $0.134-$0.24 per image; the 4K output rate is the higher end. | $0.134 | 2026-08-30 |
Quick start
Create a key in the dashboard, then submit a job and poll it. Replace the id in the second call with the one the first call returns.
1. Submit a generation
curl -s -X POST https://api.genmux.tech/v1/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"model":"nanobanana-pro","prompt":"a red fox in fresh snow, low winter sun","n":1,"resolution":"1K","ratio":"1:1"}'{
"id": "0d8b6a3e-2f1c-4a5b-9c1d-7e2f3a4b5c6d",
"model": "nanobanana-pro",
"status": "queued",
"params": {"prompt": "a red fox in fresh snow, low winter sun", "n": 1, "resolution": "1K", "ratio": "1:1"},
"cost": 4,
"created_at": "2026-08-30T20:01:12.345Z"
}2. Poll until status is succeeded (typically 1–20 s)
curl -s https://api.genmux.tech/v1/generations/0d8b6a3e-2f1c-4a5b-9c1d-7e2f3a4b5c6d \
-H "Authorization: Bearer $API_KEY"{
"id": "0d8b6a3e-2f1c-4a5b-9c1d-7e2f3a4b5c6d",
"model": "nanobanana-pro",
"status": "succeeded",
"cost": 4,
"images": [
{"index": 0, "url": "https://…/0.png?X-Amz-Expires=900&…", "expires_at": "2026-08-30T20:16:30Z", "mime": "image/png", "width": 1024, "height": 1024, "bytes": 1843201, "sha256": "9f2c…"}
],
"created_at": "2026-08-30T20:01:12.345Z",
"finished_at": "2026-08-30T20:01:19.802Z"
}import os, time, uuid, requests
BASE = "https://api.genmux.tech"
auth = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
job = requests.post(
f"{BASE}/v1/generations",
headers={**auth, "Idempotency-Key": str(uuid.uuid4())},
json={"model": "nanobanana-pro", "prompt": "a red fox in fresh snow, low winter sun", "n": 1, "resolution": "1K", "ratio": "1:1"},
timeout=30,
).json()
while job["status"] in ("queued", "running"):
time.sleep(1)
job = requests.get(f"{BASE}/v1/generations/{job['id']}", headers=auth, timeout=30).json()
print(job["images"][0]["url"]) # presigned, valid for 15 minutesconst BASE = "https://api.genmux.tech";
const auth = { Authorization: `Bearer ${process.env.API_KEY}` };
let job = await fetch(`${BASE}/v1/generations`, {
method: "POST",
headers: { ...auth, "Idempotency-Key": crypto.randomUUID(), "Content-Type": "application/json" },
body: JSON.stringify({ model: "nanobanana-pro", prompt: "a red fox in fresh snow, low winter sun", n: 1, resolution: "1K", ratio: "1:1" }),
}).then((r) => r.json());
while (job.status === "queued" || job.status === "running") {
await new Promise((r) => setTimeout(r, 1000));
job = await fetch(`${BASE}/v1/generations/${job.id}`, { headers: auth }).then((r) => r.json());
}
console.log(job.images[0].url); // presigned, valid for 15 minutesFrequently asked questions
- What is the Nano Banana Pro API?
- Nano Banana Pro is the higher-fidelity image-generation model (capability image.generate) in the Unified Image API catalogue, addressed as the model id "nanobanana-pro". The request shape is identical to the base model — same endpoint, same key, same fields — it simply spends more credits per image in exchange for more detail and better prompt adherence.
- How is Nano Banana Pro different from the base model?
- It renders more detail and follows long prompts more closely, which makes it the right pick for hero images, product shots and anything that will be printed or cropped. It costs roughly twice as much per image at 1K and adds the higher tiers: it renders at 1K, 2K, 4K, where the base model stops at 1K. For thumbnails, drafts and high-volume batches the base model is usually the better trade.
- How much does one Nano Banana Pro image cost?
- From 4 credits per image, which is about $0.05 at the Scale pack rate. Price scales with resolution: 1K — 4 credits · 2K — 6 credits · 4K — 8 credits. A request for n images costs n times the per-image price.
- When should I use the base model instead?
- When volume matters more than per-image fidelity: previews, moodboards, A/B variants, anything a user will scroll past. Both models share one key and one balance, so you can route per request — iterate on the base model at 1K, then re-render the keeper here at a higher tier — with a single field change.
- What resolutions does it support?
- Resolution is a tier, not a pixel size: this model renders at 1K, 2K, 4K, and the request defaults to 1K when you omit the resolution field. A tier outside this list is rejected with a 400 validation_error rather than silently downscaled. The older size field ("1024x1024") still works for existing integrations — it is mapped to the nearest tier and ratio — but new code should send resolution and ratio.
- What aspect ratios can I ask for?
- auto, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 5:4, 4:5, 21:9. Pass it as the ratio field; it defaults to 1:1, and "auto" lets the model choose the shape that fits the prompt. Ratio never changes the price — only the resolution tier does.
- Can I send reference images (image-to-image)?
- Yes. Pass images as an array of public https URLs — up to 14 per request — and the prompt then describes the edit or variation you want rather than the whole scene. With reference images the prompt is optional. URLs must be reachable from the public internet; private hosts and non-https URLs are rejected with a 400 validation_error.
- Is there a negative prompt?
- Yes. Pass negative_prompt alongside prompt to describe what you do not want in the frame — artefacts, text, watermarks, a colour you are steering away from. It costs nothing extra.
- How many images can I generate in one request?
- Up to 4 per call, via the n field. Each image is billed separately, so n=4 at 1K costs 4 times the per-image price. For larger batches, submit multiple jobs — the account concurrency limit (default 20 in-flight jobs) is what bounds throughput, not n.
- Are generations reproducible? Does it support seeds?
- Yes. Pass an integer seed alongside the prompt and the same seed with the same prompt, resolution and ratio gives you a reproducible result. Leave it out and each call is sampled independently.
- How long does a generation take?
- Typically 1–20 seconds from submit to succeeded, depending on size and queue depth. The API is asynchronous by design: POST /v1/generations returns a job id in milliseconds, then you either poll GET /v1/generations/{id} or let a webhook tell you when it is done.
- Is there a webhook, or do I have to poll?
- Both work. Pass webhook_url (https, public host) when you create the job and we POST once when it finishes, retrying with backoff for up to 8 attempts until your endpoint returns 2xx. Each delivery carries an HMAC-SHA256 signature you verify with your account webhook secret. Polling is fine too — jobs are cheap to read.
- What happens if a generation fails?
- You are not charged. Credits are reserved when the job is created and refunded in full if the job fails, is cancelled while still queued, or the model is temporarily unavailable (503 model_unavailable). The failed job carries an error object with a code such as content_policy so you can branch on it.
- How do credits work?
- Credits are prepaid and do not expire on a monthly cycle: buy a pack once and spend it as you generate. There is no subscription. One 1K image on this model costs 4 credits; the balance and the full ledger are visible in the dashboard and through GET /v1/account.
- What stops me from being double-charged on a retry?
- Every POST /v1/generations requires an Idempotency-Key header. Resending the same key returns the original job with 200 and charges nothing extra, so a network timeout can be retried safely. Reusing a key with a different body is rejected with 422 idempotency_key_mismatch.
- Can I use the generated images commercially?
- Yes — under our terms of service you own the rights we can pass on to the output of your generations and may use them commercially, provided the prompt and the use comply with the terms and the upstream model provider's content policy. Read the terms before shipping anything customer-facing.
- How long are the image URLs valid?
- Image URLs are presigned and expire 15 minutes after they are issued. Download the bytes to your own storage if you need to keep them; requesting the job again mints fresh URLs.
- How do I switch to another model later?
- Change the model field in the request body — nothing else about the call changes. Ids come from GET /v1/models, which also returns each model's resolution tiers, ratios and prices, so you can present the catalogue in your own UI without redeploying. An unknown id returns 404 model_not_found.
- Is there a prompt length limit?
- Prompts are 1 to 2000 characters. Longer prompts are rejected with 400 validation_error; the whole request body is capped at 64 KB.
Other models
Same key, same request shape — switch by changing the model field.
Nano Banana API
nanobananaFast, general-purpose text-to-image and image-to-image generation at 1K, behind a single HTTP endpoint. Billed per image in credits, refunded automatically when a job fails.
from 2 credits ≈ $0.025 per image
Qwen-Image 2.0 API
qwen-image-2Qwen-Image 2.0 from Alibaba — an image model built around legible in-image text, including Chinese, with reference-image input and 1K or 2K output.
from 3 credits ≈ $0.038 per image
Qwen-Image Max API
qwen-image-maxQwen-Image Max — the flagship of Alibaba's Qwen-Image line, with reference-image input, 1K and 2K output and a fixed set of five aspect ratios.
from 8 credits ≈ $0.10 per image
Seedream 5.0 API
seedream-5ByteDance Seedream 5.0 — a high-resolution model for photoreal frames and in-image text, served at 2K and 4K only. Takes reference images, billed per image in credits.
from 16 credits ≈ $0.20 per image
Wan 2.7 Image API
wan-2-7-imagewan2.7-image from Alibaba's Tongyi Wanxiang line — text-to-image and reference-image generation at 1K or 2K, on the same endpoint and API key as every other model here.
from 2 credits ≈ $0.025 per image