Ceramic mug product photos: Nano Banana Pro hero, draft on Banana 2
Draft a ceramic mug scene on Nano Banana 2 at $0.10, then render the hero on Nano Banana Pro at $0.1875 in 4:5; six mugs cost $1.725 in total.

For ceramic mug product photos, draft the scene on google/nano-banana-2 at $0.10 billed per image, then render the one you keep on google/nano-banana-pro at $0.1875 billed, both in 4:5. Sume lists Nano Banana 2 at $0.08 and Nano Banana Pro at $0.15, each times 1.25, so six mugs with one draft and one hero each cost $1.725.
Handmade ceramics sell on glaze and shape, and a hero shot that changes the glaze loses the sale. The prices and limits below are from Sume's Image API page and the catalog source, read on 2026-10-05, and the plan assumes you pass a real photo of the mug as a reference so the glaze stays yours.
What does the draft-then-hero plan cost?
Both models use the same ratio list, including 4:5, and both accept reference images. Nano Banana Pro's catalog notes that its 4K list rate is higher than the default, so the figures below are the 1K default.
| Step | Model | Billed per image | Six mugs |
|---|---|---|---|
| Draft scene | google/nano-banana-2 | $0.10 | $0.60 |
| Hero render | google/nano-banana-pro | $0.1875 | $1.125 |
| Both steps | - | $0.2875 | $1.725 |
| Hero only, no draft | google/nano-banana-pro | $0.1875 | $1.125 |
How do I render the hero with the real mug as a reference?
Pass the mug photo as input_references, keep the same aspect_ratio: "4:5", and describe the table and light only. The 1K tier is the default; set resolution only when you want another tier and have checked the price.
import os, requests
body = {
"model": "google/nano-banana-pro",
"prompt": "Keep the mug, glaze and handle exactly as they are. Place it on a linen cloth beside a window with soft morning light.",
"aspect_ratio": "4:5",
"resolution": "1K",
"input_references": [
{
"type": "image_url",
"image_url": {
"url": "https://example.com/speckled-mug.jpg"
}
}
]
}
r = requests.post(
"https://api.sume.com/v1/images",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
json=body,
timeout=60,
)
if r.status_code == 200:
out = r.json()
for img in out["data"]:
print(img["url"])
print("billed USD:", out["usage"]["cost"])
elif r.status_code == 202:
print("still running, poll:", r.json()["data"]["status_url"])
else:
print(r.status_code, r.text)Where do the checks go?
The model can alter glaze color and handle shape, so compare each result with the product beside it.
- Reject any take where the glaze, rim or handle differs from the real mug.
- Skip the draft step when a mug is simple; a hero-only run is $1.125 for six.
- Send each URL to your listing tool right away and keep the job id with it.
- If a hero call returns 202, poll
status_urlrather than resubmitting a paid call.
Sources
Related posts
More in Models
- Christmas tree lot flyer art with GPT Image 2.5: quote every line
Tree lot flyer on GPT Image 2.5: custom 1536x2048 is legal, quality defaults to high, and usage.cost shows the billed price.
- Czech, Hungarian, Romanian, Polish TTS: what MAI lists, what Sume tags
MAI-Voice-2.1 lists cs, hu, ro and pl. Sume tags only pl. A one-cent test plan and the Romanian s-comma versus s-cedilla encoding trap that breaks reads.
- Danish, Finnish, Norwegian TTS: on MAI's list, Sume tags only Swedish
MAI-Voice-2.1 lists da-DK, fi-FI, nb-NO and sv-SE. Sume's voice library tags only sv. How to test a Nordic ad read for 1 cent and keep Bokmal text consistent.
- Dutch text to speech API for ads: MAI-Voice-2.1 nl-NL vs Sume nl
Dutch is on both lists: MAI-Voice-2.1 (nl-NL) and Sume's voice tags (nl). Test numbers, loanwords and the je/u register for 1 cent, then price a campaign.
Written by Sume