Google's Gemini 1 API documentation now says: "Imagen models are shut down. Use Nano Banana 6,102 for image generation." Nano Banana is the nickname of the Gemini image models: Nano Banana 2 Lite (gemini-3.1-flash-lite-image, 1K only, $0.0336 an image), Nano Banana 2 (gemini-3.1-flash-image, 512 pixels to 4K, $0.045-$0.151) and Nano Banana Pro (gemini-3-pro-image, $0.134 at 1K or 2K, $0.24 at 4K). The original gemini-2.5-flash-image ($0.039) shuts down on 2 October 2026. The Batch API halves the prices.
Like OpenAI 86 's Responses API, these are conversational models: you send text and a dozen or more reference images with generateContent (or the newer Interactions endpoint), read the image from the returned content parts, and edit over further turns. "All generated images include a SynthID 7,023 watermark," Google's invisible watermark, which survives where C2PA metadata (C2PA Credentials) is stripped.
<!doctype html>
<style>
body { margin: 0; padding: 8px; background: #fafaf7; font: 11px system-ui, sans-serif; color: #263238; }
svg { width: 100%; max-width: 600px; display: block; }
</style>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<p><label><input type="checkbox" id="batch"> Batch API (half price)</label> · "Imagen models are shut down. Use Nano Banana for image generation."</p>
<svg viewBox="0 0 600 240" font-size="11"></svg>
<p>All Gemini images carry a SynthID watermark. Prices per image, September 2026.</p>
<script>
const MODELS = [
{ name: 'Nano Banana 2 Lite', id: 'gemini-3.1-flash-lite-image', lo: 0.0336, hi: 0.0336, note: '1K only', color: '#4285f4' },
{ name: 'Nano Banana 2', id: 'gemini-3.1-flash-image', lo: 0.045, hi: 0.151, note: '512 px to 4K', color: '#4285f4' },
{ name: 'Nano Banana Pro', id: 'gemini-3-pro-image', lo: 0.134, hi: 0.24, note: '1K/2K to 4K', color: '#4285f4' },
{ name: 'gemini-2.5-flash-image', id: 'shuts down 2 Oct 2026', lo: 0.039, hi: 0.039, note: 'retiring', color: '#b0bec5' },
{ name: 'gpt-image-2.5 (1024², low–high)', id: 'for comparison', lo: 0.006, hi: 0.053, note: 'tokens', color: '#3f7d3a' },
];
const svg = d3.select('svg');
const y = d3.scaleBand(MODELS.map(m => m.name), [10, 210]).padding(0.3);
const gx = svg.append('g').attr('transform', 'translate(0,210)');
const row = svg.selectAll('g.m').data(MODELS).join('g').attr('class', 'm').attr('transform', m => `translate(0,${y(m.name)})`);
row.append('text').attr('x', 196).attr('y', y.bandwidth() / 2 - 3).attr('text-anchor', 'end').attr('font-weight', 'bold').text(m => m.name);
row.append('text').attr('x', 196).attr('y', y.bandwidth() / 2 + 10).attr('text-anchor', 'end').attr('fill', '#78909c').text(m => m.id);
const bar = row.append('rect').attr('height', y.bandwidth()).attr('rx', 4).attr('fill', m => m.color);
const lab = row.append('text').attr('y', y.bandwidth() / 2).attr('dy', '0.35em');
function draw() {
const k = document.getElementById('batch').checked ? 0.5 : 1;
const x = d3.scaleLinear([0, 0.25], [205, 560]);
gx.transition().call(d3.axisBottom(x).ticks(5, '$.2f'));
bar.transition().attr('x', m => x(m.lo * k) - (m.lo === m.hi ? 3 : 0)).attr('width', m => Math.max(6, x(m.hi * k) - x(m.lo * k)));
lab.transition().attr('x', m => x(m.hi * k) + 8)
.text(m => m.lo === m.hi ? `$${(m.lo * k).toFixed(4)} · ${m.note}` : `$${(m.lo * k).toFixed(3)}–$${(m.hi * k).toFixed(3)} · ${m.note}`);
}
document.getElementById('batch').onchange = draw;
draw();
</script>