Skip to main content
Every model page on sunra.ai shows the price of each endpoint next to the model name — for example $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:
A 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:
Then fetch the price rules for the endpoint you plan to call:

How price rules are evaluated

The prices 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
If a matched row has a 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 the fast, 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:
A short reference video with a long output still pays a floor of two thirds of the output duration — a 6 s clip on a 30 s output is billed as 20 s of input. Input seconds are summed across all reference videos and floored to whole seconds; the frame rate, resolution and encoding of the source video do not matter. Rare exception. For a small share of reference videos the upstream model counts more input than the clip contains — we have seen 17 s clips billed as 30 s (720 input frames) on Seedance 2.5, with the same clip re-encoded at 24 or 30 fps, at other resolutions or without audio billed the same way, and the same footage cut down to its first 8 s billed normally. The trigger is the video content itself, not any request parameter, so it cannot be predicted before generation. 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:
  1. Call text-to-video, image-to-video or reference-to-video with "draft": true and "resolution": "480p" (draft mode accepts no other resolution). The output carries a draft_task_id, valid for 7 days.
  2. Call bytedance/seedance-2.5/draft-to-video with that draft_task_id (plus an optional output_format). The result is always 1080p; duration, ratio, audio and references are reused from the draft and cannot be changed.
Both steps are billed exactly like an ordinary request at their resolution: the draft at the 480p rate, the final at the 1080p rate. The final re-counts the draft’s reference-video seconds, so a draft made with reference videos settles its final at the with input video 1080p rate ($7.00 per 1M tokens on Seedance 2.5) and one made without at the without input video rate ($11.70). As always, 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:
Reference audio is free on every model. The reference rules differ per model: 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 with input_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:
Three details are worth reading twice:
  • 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_fps does 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.05peroutputlayer∗∗,sothepriceis‘0.05 per output layer**, so the price is `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.
Two things are worth knowing before you upload:
  • 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 from GET /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.