How image generation pricing works
An image is billed at a flat rate per piece, not per token. Where to find a model's exact price and how to confirm what a request actually charged.
4 min · · Updated · изображения · payments
Update, October 2026. Image generation through Zukko is temporarily unavailable. The current model list is on the Models page or at
GET https://api.zukko.pro/v1/models. Closest replacement: there is no direct replacement among the available models; for image analysis (vision), the Claude and GPT models work, e.g.claude-sonnet-5orgpt-5.6-sol.
Text models charge by input and output tokens, and the final cost of a request can only be estimated in advance — it depends on response length, which is hard to predict before generation. Images work differently: in the model catalogue they carry kind=image, meaning a separate pricing scheme — a flat price per finished picture, not per token and not per prompt length.
Why this is easier to budget for
If the number of images needed is known ahead of time, the total cost can be calculated exactly rather than estimated. A long, detailed prompt costs exactly the same as a short one — price is set purely by the chosen model, not by how much text goes into the request. That's different from text models, where spend grows with the length of the conversation and the generated response.
Where to find the current price
The model catalogue evolves, and prices move with it. Hardcoding a specific number in code, or keeping it in an old note, is a bad idea — it will drift from reality over time. The right source is the extended model listing:
curl https://api.zukko.pro/v1/models/infoThis endpoint returns not just model identifiers but limits and prices too, and it needs no key — it can be checked at any time without spending balance. The plain GET /v1/models is also available without a key, but for an exact price it's /v1/models/info specifically that's needed — the basic list is limited to which models are available.
Different models in the catalogue are priced differently because of different architectures and quality tiers: the nano-banana-2-* line (base, developer and lite versions, edit, reference-to-image) and the openai-gpt-image-2 / openai-gpt-image-1.5 line (text-to-image and edit) are different models with different prices, not variants of one. The comparison should be made against the current /v1/models/info output, not against an assumption that similarly-named models cost the same.
Checking what a specific request actually charged
Knowing a model's general price is useful for planning, but the exact amount charged for a specific call arrives right in the response headers:
curl -i https://api.zukko.pro/v1/images/generations \
-H "Authorization: Bearer fetch_your_key" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-2-text-to-image",
"prompt": "a city at sunset, watercolor"
}'The response carries X-Zukko-Cost-Micros — the cost of that specific request in micro-dollars (1,000,000 = $1) — and X-Fetch-Balance-Cents — the remaining account balance after the charge (despite the name, also in micro-dollars; the exact balance in cents is at GET /v1/balance). If generations run at volume and spend needs tracking without checking the dashboard each time, logging both headers on every request is the most direct way to do it.
The full charge history with cursor-based pagination is available on its own endpoint:
curl https://api.zukko.pro/v1/usage \
-H "Authorization: Bearer fetch_your_key"What happens when the balance can't cover a generation
Balance is checked before the model is called, not after. If there isn't enough to cover even one generation at the model's current price, the response is a 402:
{"error":{"message":"Недостаточно средств на балансе","code":"insufficient_balance"}}The generation itself never runs in that case, so a failed request charges nothing — the balance can be topped up and the same call retried without any risk that part of it was already spent for nothing.
The response cache doesn't apply here
The gateway has a cache for repeated requests — turned on with the X-Zukko-Cache: true header (or temperature: 0 for models that accept that value), keeping chat results for up to 7 days and returning a repeat with an exactly identical body for free. The cache and Idempotency-Key only apply to POST /v1/chat/completions, /v1/messages and /v1/responses, so neither can be counted on for image generation — calling /v1/images/generations again with the same prompt is billed as a separate generation. To avoid paying twice for the same result, store finished images on your side and don't rerun a task that has already completed.
The difference between variants isn't always obvious
The same base model can be priced differently depending not on the mode itself but on the exact identifier — the plain nano-banana-2-text-to-image and its developer or lite variant are listed as separate entries in the catalogue, each with its own price in /v1/models/info. Similar names don't guarantee a similar price: a suffix in a model identifier isn't a cosmetic detail, it points to a distinct pricing tier. Before locking a specific variant into a production pipeline, check its own line in the catalogue rather than the price of the model without the suffix.
Comparing several models ahead of time
For a one-off estimate, there's no need to make a real paid request to every model — pulling the full price list from /v1/models/info once and comparing the identifiers locally is enough. A real test call is only worth making for the model that's already the leading candidate, to confirm the actual charge in X-Zukko-Cost-Micros matches what the catalogue implied.
A practical tip
Before budgeting image generation into a project — say, estimating the cost of processing a catalogue of thousands of product cards — generate one test image with the intended model, check the exact figure in X-Zukko-Cost-Micros, and multiply by the planned count, rather than relying on an approximate number from old documentation or someone else's article, this one included.
zukko
Pay 25×
less
for Claude Code & ChatGPT
One fetch_* key and base URL api.zukko.pro — for Cursor, Claude Code, Codex, and any SDK.
Related articles
- Buying AI tokens: how a dollar balance works and what $5 gets youTokens at a gateway are not a package but a dollar balance. We look at what is charged to it and calculate how many requests $5 covers.
- Paying for AI without a fee: is it possible and how to calculate the overpaymentThere is almost always a fee when you top up. We show what it consists of, calculate it for SBP and card, and give a formula for how many rubles you need for N dollars.
- Paying for AI in rubles: SBP, a dollar balance and the exchange rateRubles paid via SBP turn into a dollar balance at the rate on the payment date plus the payment page fee. The formula, a top-up table and the price of requests in rubles.
- "Your card was declined" in OpenRouter: why a card gets rejectedWhy a card payment can be rejected on a foreign service, what you can check yourself and how to connect models when payment does not go through.