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 ID | CATEGORY | PRICE | UNIT |
|---|---|---|---|
| black-forest-labs/flux-3 | Video | $0.84 | per second |
| bytedance/seedance-2 | Video | $0.078 | per second |
| bytedance/seedance-2-5-omni | Video | $0.182 | per second |
| bytedance/seedance-2-mini | Video | $0.065 | per second |
| bytedance/seedance-2-omni | Video | $0.1235 | per second |
| google/veo-2 | Video | $0.13 | per video |
| google/veo-3.1 | Video | $0.65 | per video |
| google/veo-3.1-fast | Video | $0.026 | per video |
| google/veo-3.1-lite | Video | $0.026 | per video |
| kling/kling-video-2-1-10s | Video | $0.039 | per video |
| kling/kling-video-2-1-5s | Video | $0.0455 | per video |
| kling/kling-video-2-5 | Video | $0.0195 | per video |
| kling/kling-video-2-6 | Video | $0.039 | per video |
| kling/kling-video-3-0 | Video | $0.0715 | per second |
| kling/kling-video-3-0-edit | Video | $0.078 | per video |
| kling/kling-video-motion | Video | $0.039 | per video |
| kling/kling-video-motion-3 | Video | $0.065 | per video |
| routehook/omni-flash | Video | $0.04875 | per video |
| xai/grok-video | Video | $0.0975 | per video |
| google/nano-banana-2 | Image | $0.0195 | per image |
| google/nano-banana-2-lite | Image | $0.0195 | per image |
| google/nano-banana-pro | Image | $0.0195 | per image |
| openai/gpt-image-2 | Image | $0.039 | per image |
| xai/grok-image | Image | $0.026 | per image |
| anthropic/claude-fable-5 | Text | $12.50 | per 1M tokens |
| anthropic/claude-fable-5-1 | Text | $12.50 | per 1M tokens |
| anthropic/claude-opus-5 | Text | $6.25 | per 1M tokens |
| anthropic/claude-sonnet-4-6 | Text | $3.75 | per 1M tokens |
| anthropic/claude-sonnet-5 | Text | $2.50 | per 1M tokens |
| deepseek/deepseek-flash | Text | $0.375 | per 1M tokens |
| deepseek/deepseek-v4-pro | Text | $0.375 | per 1M tokens |
| openai/gpt-5.4 | Text | $3.125 | per 1M tokens |
| openai/gpt-5.4-mini | Text | $0.9375 | per 1M tokens |
| openai/gpt-5.4-nano | Text | $0.25 | per 1M tokens |
| openai/gpt-5.5 | Text | $6.25 | per 1M tokens |
| openai/gpt-5.6-luna | Text | $0.25 | per 1M tokens |
| openai/gpt-5.6-sol | Text | $5.00 | per 1M tokens |
| openai/gpt-5.6-terra | Text | $2.50 | per 1M tokens |
| openai/gpt-6-astra | Text | $12.50 | per 1M tokens |
| openai/gpt-audio-1.5 | Text | $40.00 | per 1M tokens |
| openai/gpt-audio-mini | Text | $12.50 | per 1M tokens |
| openai/gpt-image-2.5-flare | Text | $10.00 | per 1M tokens |
| openai/gpt-image-2.5-sunburst | Text | $10.00 | per 1M tokens |
| openai/gpt-live-1 | Audio | $0.001042 | per second |
| openai/gpt-live-transcribe | Audio | $0.000354 | per second |
| openai/gpt-realtime-translate | Audio | $0.000708 | per second |
| openai/gpt-realtime-whisper | Audio | $0.000354 | per second |
| openai/gpt-transcribe | Audio | $0.000094 | per second |
| openai/text-embedding-3-large | Embeddings | $0.1625 | per 1M tokens |
| openai/text-embedding-3-small | Embeddings | $0.025 | per 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.