How much do 10,000 AI images cost? Work out a budget
How to work out a monthly image budget: the formula, examples across models and resolutions, what stays out of the bill, and a template for your own counts.
Rendergrid editorsAbout the editors
In brief
A monthly budget is the number of images × the price per image, and the price depends on the model and the resolution. Only finished images count: a failed request is free, because the amount goes straight back to your balance. Nano Banana Flash at 1K, for example, is $0.015 per image, so 10,000 images are 10,000 times that. The template at the end works out the sum from your own prices.
How do you work out a monthly image budget?
The formula is total = images × price. Count the finished images you plan to make in a month and multiply by the price per image of the model and resolution you will use. With several, work out each pair and add the results. Prices are in US dollars, with no subscription.
Name the resolution in every request. Without resolution, an image is rendered and paid for at the model’s default: 2K for Nano Banana Pro, Nano Banana 2, and Nano Banana 2.1, and 1K for Nano Banana Flash.
What counts toward the bill?
Rendergrid charges the price when it accepts a request, before any work starts. If no image is made, the charge is refunded automatically, including for a request declined under the content rules, and a request rejected with a 400 before the charge costs nothing. So a budget counts finished images only. Details: how a failed request is refunded and the balance documentation.
What does 10,000 images a month look like?
The volume is an assumption, a round number for the arithmetic, not Rendergrid’s traffic or any account’s. Each line is images × price.
- 10,000 images at 1K with Nano Banana Flash: 10,000 × $0.015
- 10,000 images at 2K with Nano Banana 2.1: 10,000 × $0.03
- 10,000 images at 4K with Nano Banana Pro: 10,000 × $0.07
- A mixed month: 5,000 at 1K on Nano Banana Flash, 4,000 at 2K on Nano Banana 2.1, and 1,000 at 4K on Nano Banana Pro: 5,000 × $0.015 + 4,000 × $0.03 + 1,000 × $0.07
No totals are printed, because prices change. Multiply with today’s prices, or use the spend calculator on the pricing page, which takes a model and a monthly volume.
For one model’s full price list, see the Nano Banana 2.1 price article and the Nano Banana Pro price article.
What do the three example images show?
The three images illustrate the pairs above. Each comes from a different prompt, so they are not a quality comparison and cannot show what a higher resolution adds to your own prompt. Each was made in one attempt through the Rendergrid API, and its prompt is printed with it.
One prompt, one image
A single cream rectangular soap bar rests on a pale blue paper stage. Show its rounded edges from a three-quarter angle under soft left light and a short shadow. Keep the full bar centered within a minimal, smooth background and broad margins. No lettering, logos, people, or watermarks.
Nano Banana Flash
nano-banana-flash · 1K · 1:1 · $0.015
Nano Banana Flash, 1K, 1:1, one attempt. A single cream soap bar with rounded corners and edges rests on a smooth pale blue surface. The view is a raised three-quarter angle, so the top and two sides of the bar show. Light comes from the left, and the bar casts a short, soft shadow to its right. The bar is centered in the frame, with broad empty margins on every side, as the prompt asked. There is no lettering, logo, person, or watermark. No departure from the prompt is visible.
One prompt, one image
A cream rectangular soap bar and a folded white towel sit on a pale blue stage. Use a three-quarter view and soft light from the left to reveal smooth soap edges and towel loops. Keep both objects complete within a quiet, spacious arrangement. No lettering, logos, people, or watermarks.
Nano Banana 2.1
nano-banana-2.1 · 2K · 1:1 · $0.03
Nano Banana 2.1, 2K, 1:1, one attempt. A cream soap bar with rounded edges stands on the left of a pale blue stage. To its right and slightly behind it sits a thick white towel folded in layers, with its terry loops visible. Light comes from the left, and the soap casts a soft shadow to its right. Three things depart from the prompt. It asked for both objects to be complete in a spacious arrangement, but the towel is cut off by the right edge of the frame. It asked for a three-quarter view, but the soap is seen almost front-on from slightly above. It did not mention a wall, and the frame shows a gray-green wall behind the stage; the stage’s darker front face fills the lower quarter. There is no lettering, logo, person, or watermark.
One prompt, one image
Place a cream rectangular soap bar on a clear glass soap dish beside soft folds of a white towel on pale blue. Use a three-quarter angle and left lighting to reveal the fine glass edge, reflections and towel loops. Center the entire group with generous open margins. No lettering, logos, people, or watermarks.
Nano Banana Pro
nano-banana-pro · 4K · 1:1 · $0.07
Nano Banana Pro, 4K, 1:1, one attempt. A cream soap bar rests on a clear glass soap dish with a ridged, stepped rim. The soap’s surface looks rough and pitted rather than smooth. The view is a high three-quarter angle: the top and two sides of the bar show. Light comes from the left; the dish casts a dark shadow to its lower right, and bright reflections of the glass lie on the surface to its lower left. A white towel with a looped pile lies in soft folds on the right and runs off the right and bottom edges. The prompt asked for the whole group to be centered with generous open margins. The soap and its dish sit left of the center and the towel fills the right side, so the placement departs from the prompt. A small dark mark touches the top edge near the upper right; it is too small to identify at this size. Viewed at about half size, the ridges of the glass, the pitting of the soap, and the loops of the towel can be made out.
All three show one cream soap bar and a pale blue ground, with no lettering, logo, person, or watermark. Two depart from their prompts on placement, and the 2K image also on its view; the captions list each departure.
How do you cap what you spend?
A monthly limit turns a budget into a hard cap. Set one for the account, for all keys together, in the portal’s “Balance and top-ups” section, or for a single key in the “API keys” section. Charges are counted by the UTC calendar month, and the refund for a failed image frees that amount. When a limit is used up, the next generation request gets 402 ERR_INSUFFICIENT_BALANCE with details.reason = monthly_budget_exceeded, and nothing is charged. See the limits documentation.
To fund the budget, top up in USDT in the portal’s “Balance and top-ups” section or through an account manager (USDT top-up).
Where does this method not fit?
- 10,000 is an example. Put your own count in its place.
- Prices change. Prices are shown without taxes, and your account can have its own prices. An increase takes effect no sooner than 7 days after notice, and a reduction immediately; a request is charged the price in effect when it was sent (terms).
- Images, not attempts. The formula prices the images you plan to make. After a failure, a new attempt is a new request with a new idempotency key and its own charge.
How do you work out your own budget with the API?
GET /models returns the models available to your account with your own prices. Take the price of a resolution from a model’s variants, never from the root price, which is the cheapest resolution’s. The template multiplies each price by a count you set and adds the lines; a model or resolution missing from your catalog is reported, never counted as zero. The curl tab only fetches the prices; Python and Node.js also do the sum.
curl --fail-with-body --max-time 20 \ "https://api.rendergrid.io/ api/ public/ v1/ models?category=image" \ -H "Authorization: Bearer $RENDERGRID_API_KEY"
import os from decimal import Decimal import requests API = "https://api.rendergrid.io/ api/ public/ v1" KEY = os.environ["RENDERGRID_API_KEY"] # Your month: (model, resolution) -> number of images. Replace these counts with your own. PLAN = { ("nano-banana-2.1", "2K"): 6000, ("nano-banana-pro", "4K"): 4000, } response = requests.get( f"{API}/models", params={"category": "image"}, headers={"Authorization": f"Bearer {KEY}"}, timeout=(5, 20), ) response.raise_for_status() # Your account's price for each resolution is in variants, not in the root price. prices = {} for model in response.json()["models"]: for variant in model.get("variants", []): prices[(model["id"], variant["variant_key"].upper())] = Decimal(variant["price"]) total = Decimal("0") for (model_id, resolution), images in PLAN.items(): price = prices.get((model_id, resolution)) if price is None: print(model_id, resolution, "has no price in your catalog: not counted") continue line = price * images total += line print(model_id, resolution, images, "images x", price, "=", line) print("total for the lines above:", total)
// Node.js 22+, .mjs file const API = "https://api.rendergrid.io/ api/ public/ v1"; const headers = { Authorization: `Bearer ${process.env.RENDERGRID_API_KEY}` }; // Your month: "model:resolution" -> number of images. Replace these counts with your own. const plan = { "nano-banana-2.1:2K": 6000, "nano-banana-pro:4K": 4000, }; const url = new URL(`${API}/models`); url.searchParams.set("category", "image"); const response = await fetch(url, { headers, signal: AbortSignal.timeout(20_000) }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${await response.text()}`); } // Prices are strings with four decimals: work in whole units of 0.0001, never in floats. const toUnits = (price) => { const [whole, fraction = ""] = price.split("."); return BigInt(whole + fraction.padEnd(4, "0").slice(0, 4)); }; // Your account's price for each resolution is in variants, not in the root price. const prices = new Map(); for (const model of (await response.json()).models) { for (const variant of model.variants ?? []) { prices.set(`${model.id}:${variant.variant_key.toUpperCase()}`, toUnits(variant.price)); } } let total = 0n; for (const [key, images] of Object.entries(plan)) { const price = prices.get(key); if (price === undefined) { console.log(`${key} has no price in your catalog: not counted`); continue; } total += price * BigInt(images); console.log(`${key}: ${images} images`); } const dollars = `${total / 10000n}.${String(total % 10000n).padStart(4, "0")}`; console.log(`total for the lines above: ${dollars}`);
A failed request is free
Work out your own month
Choose a model and enter your monthly volume on the pricing page. If a request fails, the amount goes straight back to your balance.
Calculate your spendQuestions and answers
How much do 10,000 images cost?
Do failed requests count toward the budget?
What happens if I leave out the resolution?
Sources
- Rendergrid pricingThe price per image and the spend calculator.
- Rendergrid documentation: models and parametersDefault resolution, prices, and
GET /models. - Rendergrid documentation: balanceWhen a request is charged and refunded.
- Rendergrid documentation: limitsMonthly spending limits.
- Rendergrid termsTaxes and price changes.





