Skip to content
docs/pricingModels

Pricing

How a request becomes a number, and where that number lands.

Each model bills against one unit — per million tokens, per image, per second of video — and publishes that unit alongside its rate, so the cost of a request is arithmetic rather than an estimate and switching models is a price change you can read before you make it.

One model, several rates

A media model does not always have a single price. Seedance 2 sells at six rates from $0.078 to $0.351 a second depending on the mode and resolution you ask for, and GPT Image 2 at nineteen from $0.039 to $0.728 an image. Those are configurations, and the one your request matches is the one you are billed at. Send the parameters that select it — mode, resolution, duration — and the charge is decided before the work starts. Send none and the route's own documented default applies, and that configuration's rate is what you pay. Plenty of models sell at one rate for every configuration instead: Nano Banana Pro is $0.0195 an image at 1K, 2K and 4K alike, and Veo 3.1 Fast is $0.026 for a video of any length it accepts. Each model's page says which of the two it is.

What price on a model means

GET /v1/models publishes price as the cheapest rate a request can actually reach, so on a model sold at several it is a from figure rather than the only one, and unit says what that rate is charged against — per image, per second of video, or per video however long it runs. Read both: a per-video rate multiplied by a clip length is an invoice that never arrives. Token rates are quoted per million there, matching the unit beside them, while pricing carries the exact per-token string for arithmetic. Every model's own page lists its full ladder, one row per configuration, which is the place to look before you commit to a shape.

Durations are not a free range

Video routes accept fixed sets rather than any number of seconds: Veo takes 4, 6 or 8 and refuses everything else, Grok takes 4 to 10 and 15. Models that constrain it publish accepted_durations on GET /v1/models, and a null there means the route imposes no set rather than that we do not know. Read it before you build a control, because a duration the route rejects fails after you have been quoted, not before.

Live rates

MODEL IDCATEGORYPRICEUNIT
black-forest-labs/flux-3Video$0.84per second
bytedance/seedance-2Video$0.078per second
bytedance/seedance-2-5-omniVideo$0.182per second
bytedance/seedance-2-miniVideo$0.065per second
bytedance/seedance-2-omniVideo$0.1235per second
google/veo-2Video$0.13per video
google/veo-3.1Video$0.65per video
google/veo-3.1-fastVideo$0.026per video
google/veo-3.1-liteVideo$0.026per video
kling/kling-video-2-1-10sVideo$0.039per video
kling/kling-video-2-1-5sVideo$0.0455per video
kling/kling-video-2-5Video$0.0195per video
kling/kling-video-2-6Video$0.039per video
kling/kling-video-3-0Video$0.0715per second
kling/kling-video-3-0-editVideo$0.078per video
kling/kling-video-motionVideo$0.039per video
kling/kling-video-motion-3Video$0.065per video
routehook/omni-flashVideo$0.04875per video
xai/grok-videoVideo$0.0975per video
google/nano-banana-2Image$0.0195per image
google/nano-banana-2-liteImage$0.0195per image
google/nano-banana-proImage$0.0195per image
openai/gpt-image-2Image$0.039per image
xai/grok-imageImage$0.026per image
anthropic/claude-fable-5Text$12.50per 1M tokens
anthropic/claude-fable-5-1Text$12.50per 1M tokens
anthropic/claude-opus-5Text$6.25per 1M tokens
anthropic/claude-sonnet-4-6Text$3.75per 1M tokens
anthropic/claude-sonnet-5Text$2.50per 1M tokens
deepseek/deepseek-flashText$0.375per 1M tokens
deepseek/deepseek-v4-proText$0.375per 1M tokens
openai/gpt-5.4Text$3.125per 1M tokens
openai/gpt-5.4-miniText$0.9375per 1M tokens
openai/gpt-5.4-nanoText$0.25per 1M tokens
openai/gpt-5.5Text$6.25per 1M tokens
openai/gpt-5.6-lunaText$0.25per 1M tokens
openai/gpt-5.6-solText$5.00per 1M tokens
openai/gpt-5.6-terraText$2.50per 1M tokens
openai/gpt-6-astraText$12.50per 1M tokens
openai/gpt-audio-1.5Text$40.00per 1M tokens
openai/gpt-audio-miniText$12.50per 1M tokens
openai/gpt-image-2.5-flareText$10.00per 1M tokens
openai/gpt-image-2.5-sunburstText$10.00per 1M tokens
openai/gpt-live-1Audio$0.001042per second
openai/gpt-live-transcribeAudio$0.000354per second
openai/gpt-realtime-translateAudio$0.000708per second
openai/gpt-realtime-whisperAudio$0.000354per second
openai/gpt-transcribeAudio$0.000094per second
openai/text-embedding-3-largeEmbeddings$0.1625per 1M tokens
openai/text-embedding-3-smallEmbeddings$0.025per 1M tokens

Rates are strings

Per-token rates come back as JSON strings, not numbers. A rate of 0.00000015 per token does not survive a round trip through a double intact, and a billing figure that is almost right is worse than one that is obviously a string. Parse them with a decimal library, not parseFloat. Balances on GET /v1/credits are the exception: those are numbers, rounded to two places.

Reserve, then settle

Nothing is charged before it is known. The most a request could cost is held against the balance when it starts, the real cost is settled when it finishes, and the hold is released if it fails, which is why GET /v1/credits reports balance and held separately, and why a retry after a 5xx does not pay twice.

What one call cost

GET /v1/generation?id=req_… reports the charge for a single request alongside the tokens it was computed from, so a charge can be checked against the usage behind it rather than taken on trust.

What is not charged

  • Requests that fail before any upstream call is made.
  • Jobs that end failed or canceled. The hold is released, not settled.
  • Input and reference images. An edit against references costs what a generation costs.
  • Storing a result, or downloading it afterwards.
  • Reading the catalogue, a job's status, the key, the balance or the status page.