$0.045-$0.09 per image. Hovering the price shows a tooltip with the exact rule, such as which resolutions or options change the price.
For most models the price of a request is fixed at submission time: it is computed from your request parameters before the model runs, and that exact amount is what appears in your billing history. The same request parameters always cost the same amount, so you can budget deterministically. A few models (for example video models billed per output second) settle after completion based on actual usage; their tooltips say so.
Pricing API
You can read prices programmatically — both as human-readable strings and as machine-readable rules.Paging the pricing list
GET /v1/pricing returns a list envelope — { "object": "list", "data": [...], "has_more": … } — and takes:
Page forward until
has_more is false:
starting_after that is not the id of a row this endpoint returns is a 400 — it is never treated as “start from the beginning”. ending_before is not supported; page forward instead. If you just want the whole catalog in one call, a large limit works too.
To compute the exact price of a request before sending it, first look up the model id:
How price rules are evaluated
Theprices array is evaluated top to bottom against your request payload, and the first row whose matches conditions all hold determines the price. A row without matches always matches — it is the fallback.
Conditions compare your request parameters:
A parameter that is absent from your request never matches a condition — defaults are not filled in before matching. Price tables are ordered so that omitting an optional parameter lands on the row for its default behavior.
Worked example, using the table above:
{"images": [a], "resolution": "1K"}→ first row → $0.045{"images": [a, b, c], "resolution": "1K"}→ 1K row with$size: 3→ $0.053{"images": [a]}(resolution omitted, model defaults to 2K) → skips the 1K rows, hits$size_lte: 1→ $0.09
usage_key, the amount is unit_amount × that parameter’s value (for example price per second of requested duration).
Seedance video token pricing
The Seedance 2.0 family (including thefast, mini and relay variants) and Seedance 2.5 are billed per token, not per output second. Their price rule is "type": "post_calculated": the amount is settled after generation from the usage the model reports. total_tokens in the prediction output is the authoritative quantity, and the charge is total_tokens × rate, with the rate quoted per 1M tokens.
The rate depends on the output resolution and on whether the request carries reference videos — requests with input video are billed at a lower rate for the whole request. The rates per model are in the price tooltip on the model page and in the tooltip field of GET /v1/pricing/model/{model_id}/endpoint/reference-to-video. For these endpoints the machine-readable prices array carries only the settlement unit, because the token count does not exist until the model has finished generating.
How tokens are counted
width × height is the resolution of the video you actually receive. With ratio: adaptive that follows your input, so it is not necessarily the aspect ratio you would assume from the resolution setting — read it from the output file if you want to reproduce a charge exactly. The frame count is accurate to about one frame (the upstream occasionally returns one fewer); total_tokens is always what you are billed on.
Reference images and reference audio add no tokens. Only reference videos do.
Billed input seconds
Reference video is not billed for its literal length. The billed input duration is computed per task:total_tokens in the prediction output is always what you are billed on.
Worked examples
Seedance 2.5, 720p 16:9 output — 1280 × 720 = 900 tokens per frame — with a reference video, at $6.40 per 1M tokens:Draft mode (Seedance 2.5)
Seedance 2.5 can render a cheap 480p draft first and later upscale exactly that draft — same seed, same prompt and references — to 1080p without re-describing it:- Call
text-to-video,image-to-videoorreference-to-videowith"draft": trueand"resolution": "480p"(draft mode accepts no other resolution). The output carries adraft_task_id, valid for 7 days. - Call
bytedance/seedance-2.5/draft-to-videowith thatdraft_task_id(plus an optionaloutput_format). The result is always 1080p; duration, ratio, audio and references are reused from the draft and cannot be changed.
total_tokens in each output is the billed quantity.
Two things to know: draft mode is served only by the default (BytePlus) channel — a request that pins another provider with draft: true fails before generation — and the draft_task_id works like a signed URL: anyone holding it can finalize it at 1080p on their own account, so treat it as private.
MiniMax H3 family per-second pricing
The four official MiniMax H3 models are billed per second of output video, at a rate that depends on the output resolution you ask for:
For text-to-video and image-to-video the amount is fixed at submission (
"type": "pre_defined"): it is the rate of the selected tier multiplied by the duration you request, in whole seconds. A 5 s 768P clip on minimax/minimax-h3 costs 5 × $0.08 = $0.40; the same clip at 2K costs $0.65.
The resolution parameter picks the tier. Omitting it uses the model’s default resolution shown above — the price table is ordered so that a request without resolution lands on the default tier’s rows (see How price rules are evaluated).
minimax/minimax-h3-fast serves 480P only and has no resolution parameter. minimax/minimax-h3-max-turbo has no reference-to-video endpoint; calling it returns 404 MODEL_ENDPOINT_NOT_FOUND.
Reference-to-video input materials
reference-to-video is settled after completion ("type": "post_calculated") from the usage MiniMax reports, because reference material is billed on top of the output:
Note that
minimax/minimax-h3-max bills reference video at its own rate table, which is higher than its output rate — reference video is the dominant cost in a reference-to-video request on that model.
H3 worked example
minimax/minimax-h3-max reference-to-video at 768P, 5 s of output, one 5 s reference video and 3 reference images:
Topaz Hyperion 2.5 SDR-to-HDR pricing
topazlabs/hyperion-2.5/sdr-to-hdr is billed per frame, in credits of $0.10, and settled after completion ("type": "post_calculated"). Hyperion keeps the resolution, frame rate and duration of your input, so the charge is fully predictable from the input file:
seconds is the container duration rounded up to a whole second, and fps is the stream’s frame rate. For variable-frame-rate files the higher of the average and nominal rate is used, so re-encode to a constant frame rate if you want the lowest bill.
Input limits
A request is checked before it is submitted upstream and rejected withinput_validation_failed — not billed — if the video exceeds any of these:
Only
http(s):// video URLs are accepted; data: URIs are not.
Hyperion worked examples
Topaz video-upscaler pricing
topazlabs/video-upscaler/video-upscale is billed per second of output video and settled after completion ("type": "post_calculated"). The per-second rate is set by the size of the output frame, so upscale_factor is what moves the bill:
- The tier is the pixel count, not the height. A 1632 × 672 output is 1.10 megapixels, so it bills at the 1080p rate even though it is only 672 px tall; an 820 × 852 output is 0.70 megapixels and bills at the 720p rate even though it is 852 px tall.
- Seconds round up. A 5.038-second output is 6 billable seconds.
- Frame interpolation is free. Setting
target_fpsdoes not change the price, at any value.
Video upscaler worked examples
Qwen Image Layered pricing
qwen/qwen-image-layered/image-to-image returns one image per layer and is billed **0.05 × num_layers. num_layers accepts 1–10 and defaults to 4, which makes the default request $0.20. Because the count is an input, the price is known before the job runs (”type”: “pre_defined”`).
FLUX.2 [pro] image-to-image pricing
black-forest-labs/flux-2-pro/image-to-image is billed per processed megapixel and settled after completion ("type": "post_calculated"). One megapixel is 1024 × 1024 = 1,048,576 pixels.
- A reference image always costs exactly 1 megapixel, however large it is — the model downsamples it, and there is no discount for sending a small one either.
- Each image is rounded up on its own, so a 1536 × 1024 result (1.5 MP) counts as 2 MP.
image_urls accepts up to 8 reference images. text-to-image is unaffected: all of its aspect ratios fit in one megapixel, so it stays a flat $0.03 per image.
FLUX.2 [pro] worked examples
gpt-image-1.5 token pricing
openai/gpt-image-1.5 is billed as a per-image price plus the tokens you send in, and settled after completion ("type": "post_calculated").
text-to-image has no reference images, so its bill is the table above plus the prompt.
What a reference image costs
input_fidelity is what drives the reference-image cost, and it defaults to high:
Resolution beyond that barely matters: the image is scaled so its shortest side is 512 px before it is tiled, which is why a 512 × 512 and a 2048 × 2048 square cost the same.
A
mask_image is not charged as a reference image, and the text the model writes alongside the image is not charged either.
gpt-image-1.5 worked examples
Only the first row includes a prompt; the other three leave it out, since a typical prompt adds well under $0.0005. Every amount is rounded up to the next $0.0001.
LLM token pricing
LLM models (chat, messages, responses) are billed per token rather than per request. Rates are listed on each model’s page under sunra.ai/models and readable programmatically fromGET /v1/pricing/model/{model_id}/endpoint/llm.
A model’s rate card carries one rate per token bucket. The common buckets are:
Cache reads are billed at the cache-read rate and are removed from the input bucket, so a cached token is charged once, at the lower rate. For
deepseek-v4-flash the cache-read rate is $0.0028 per 1M tokens against an input rate of $0.14 — 50× cheaper; for deepseek-v4-pro it is $0.003625 against $0.435. A model with no cache-read rate on its card bills cached tokens at its input rate.
You do not need to send anything to opt in — see prompt cache hits for how hits are reported back to you.
A request whose prompt is 98,695 tokens with 96,128 of them served from cache settles as three separate lines, and the input line counts only the 2,567 tokens that were not cached:
Unlike most multimodal endpoints, an LLM request cannot be priced before it runs — the token count is not known until the model answers. Credits are reserved at submission from a conservative estimate of your prompt, and the reservation is settled against actual usage when the request completes; the difference is released. Your billing history shows the settled amount.
Streamed requests that end early are billed for the output actually delivered to you, and requests that fail are not billed at all — see Output limits and stream lifetime.