Nano Banana is where the family started: Google's Gemini 2.5 Flash Image, released in August 2025. Google now calls it a legacy model, so most new projects are better off on a newer tier. It still earns its place when you have a workflow built around its style, or when a quick 1K edit is all you need.
What you can make
- A stable baseline for an existing pipeline while you test newer models next to it.
- Quick 1K fixes: a new background, a different outfit, an object taken out.
- Avatars and social thumbnails where high resolution adds nothing.
- A single scene put together from a few reference photos.
Settings that matter
- Resolution: 1K only. Asking for 2K or 4K gives an error.
- Output: one image per request.
- References: up to 14 images for editing or composing.
- Aspect ratio: 10 shapes from 1:1 to 21:9. The Kadraris default is 1:1, so on edits set the ratio of your source photo.
- Edit wording: write instructions, not descriptions, and name what has to stay.
Starter prompt
Remove the parked car from the street, keep the shop fronts, the wet pavement and the evening lighting exactly as they areSwap the removed object for yours and keep the "keep ... exactly" part so the rest of the photo is left alone.
Questions
How much is one Nano Banana edit?
$0.0359 per image. You see the estimate before the request runs, and a failed generation is refunded in full.
Should I still start new projects on Nano Banana?
Usually not. Google lists it as legacy, and Nano Banana 2 or Nano Banana Pro give you higher resolution and more options. Keep this one for pipelines that already depend on it.
Can I get more than one picture per request?
No, it returns one. Moving the same prompt to Nano Banana 2 gets you up to four per call.
Nano Banana 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",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"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",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"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",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"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 | ≤ 32000 chars | |
aspect_ratio | string | 1:1 2:3 3:2 3:4 4:3 4:5 5:4 9:16 16:9 21:9 | 1:1 |
resolution | string | 1k | 1k |
image_urls | array | max 14 |
Fetch this list as JSON with GET /v1/models/nano-banana.


























