Nano Banana 2.1 is Google's next step after Nano Banana 2. It still generates from text and edits photos with up to 14 references, but the pricing changed: 1K, 2K and 4K all cost the same. That means there is no reason to save money with a small draft, you can go straight to full size.
What you can make
- Large 4K banners and print graphics without paying more for the pixels.
- Product photo edits that keep the original framing and only change what you name.
- Composites from several sources: one image for the product, one for the person, one for the backdrop.
- Very wide 8:1 website strips and tall 1:8 sidebar art.
Settings that matter
- Resolution: 1K, 2K or 4K at one price. Render at the final size on the first try.
- Aspect ratio: 14 shapes including 1:4, 4:1, 1:8 and 8:1, plus
auto, which keeps the photo's shape during edits. - References: up to 14 images in
image_urls. Give each one a role in the prompt so the model knows what to take from it. - Edits: state what should change and what has to stay untouched, for example "keep the label text and bottle shape".
- Output: one image per request, so variants mean separate runs.
Starter prompt
First image is the bottle, second is the beach. Place the bottle upright in wet sand at sunset, keep the label text sharp and unchanged, 4K, photographicReplace the two roles with your own references and keep the "unchanged" part for whatever must not move.
Questions
How much is a Nano Banana 2.1 image?
$0.0699 per image per picture at any resolution. If generation fails, the hold returns in full and you pay nothing.
What did I give up compared with Nano Banana 2?
Version 2 has a 0.5K tier, prices by resolution and can return up to 4 images per request. Version 2.1 returns one image at a time and drops 0.5K, but 2K and 4K cost the same as 1K. More in the 2.1 vs 2 comparison.
Can I start from a photo on my computer?
Yes. In Kadraris Studio you drag files in directly; through the API you pass links in image_urls.
Nano Banana 2.1 in your code
curl https://kadraris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $KADRARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-2.1",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "auto",
"resolution": "1k"
}
}'import os, time, requests
API = "https://kadraris.com/v1"
H = {"Authorization": f"Bearer {os.environ['KADRARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "nano-banana-2.1",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "auto",
"resolution": "1k"
}
}).json()
while task["status"] in ("queued", "running"):
time.sleep(3)
task = requests.get(f"{API}/tasks/{task['id']}", headers=H).json()
print(task["status"], task["cost"], [o["url"] for o in task["output"]])const API = "https://kadraris.com/v1";
const headers = { Authorization: `Bearer ${process.env.KADRARIS_API_KEY}`, "Content-Type": "application/json" };
let task = await (await fetch(`${API}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
"model": "nano-banana-2.1",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "auto",
"resolution": "1k"
}
}),
})).json();
while (task.status === "queued" || task.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
task = await (await fetch(`${API}/tasks/${task.id}`, { headers })).json();
}
console.log(task.status, task.cost, task.output.map((o) => o.url));
Input fields
| Parameter | Type | Allowed | Default |
|---|---|---|---|
prompt * | string | ||
aspect_ratio | string | auto 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 2k 4k | 1k |
image_urls | array | max 14 |
Fetch this list as JSON with GET /v1/models/nano-banana-2.1.























