200 Nano Banana thumbnails: budget from 9 to 30 dollars

Google lists Gemini 3.1 Flash Image at about $0.045 to $0.151 per image by resolution. What 50, 200 and 1,000 thumbnails cost at each end of that range.

4 min readSume
All posts

At Google's listed range of about $0.045 to $0.151 per image, 200 thumbnails from Gemini 3.1 Flash Image (Nano Banana 2) cost between $9.00 and $30.20 before retries. The figure moves with the output resolution you choose, so pick the size first and then multiply.

Where the range comes from

Google's pricing page lists Gemini 3.1 Flash Image output at $60 per 1M tokens and translates that into roughly $0.045 to $0.151 per image depending on resolution. The low end corresponds to the smaller sizes and the high end to the larger ones. The page does not give a single flat price, so a budget has to carry both ends.

Batch totals at Google's listed per-image range (read 2026-10-03)
ImagesAt $0.045 eachAt $0.151 each
50$2.25$7.55
200$9.00$30.20
1,000$45.00$151.00

Add a retry allowance

Thumbnails are rarely accepted on the first try. If you expect to keep one image in three, multiply the table by three: 200 keepers at the low end becomes 600 generations, or $27.00. Decide your keep rate from a small test of 20 images before you size the full batch.

Drafting at a small size and regenerating only the winners at a larger size usually costs less than generating everything large. The arithmetic is simple: 200 drafts at $0.045 plus 20 finals at $0.151 comes to $12.02.

Reading the cost on Sume

The numbers above are Google's list prices. On Sume, the amount you pay is the pricing line on the model's endpoint record (GET /v1/images/models/{model_id}/endpoints), and cost_usd × n is the cost of a request. Each image response also carries usage.cost, the USD amount billed, so you can add them up as a batch runs. Token counts are always 0 in v1 because image models are metered per image.

Failed or cancelled generations are not billed, so retries on failures do not add to the total.

import os
import requests

URL = "https://api.sume.com/v1/images"
HEADERS = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}


def main() -> None:
    total = 0.0
    for prompt in ["a red kettle on a white desk, thumbnail composition"]:
        r = requests.post(
            URL,
            headers=HEADERS,
            json={"model": "nano-banana-2", "prompt": prompt, "aspect_ratio": "16:9", "resolution": "1K"},
            timeout=60,
        )
        if r.status_code == 200:
            total += r.json()["usage"]["cost"]
        else:
            print(r.status_code, "is not a finished image; poll the job")
    print(f"billed so far: ${total:.4f}")


if __name__ == "__main__":
    main()

Takeaway

Budget with both ends of the range, add a keep-rate multiplier, and track usage.cost as you go. A 200-image test at low resolution will tell you more than any estimate.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume