Pricing
How a request becomes a number, and where that number lands.
Each model bills against one unit, per million tokens, per image, per clip at a stated length and resolution. The unit and the rate are published on the model itself, 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.
Live rates
| MODEL ID | CATEGORY | PRICE | UNIT |
|---|---|---|---|
| bytedance/seedance-2 | Video | $7.00 | per second |
| bytedance/seedance-2-omni | Video | $7.00 | per second |
| google/veo-2 | Video | $2.80 | per second |
| google/veo-3.1 | Video | $1.40 | per second |
| google/veo-3.1-fast | Video | $29 | per second |
| google/veo-3.1-lite | Video | $20 | per second |
| kling/kling-video-2-5 | Video | $7.00 | per second |
| kling/kling-video-2-6 | Video | $7.00 | per second |
| kling/kling-video-3-0 | Video | $5.60 | per second |
| openai/sora-2 | Video | $0.10 | per second |
| openai/sora-2-pro | Video | $0.30 | per second |
| openai/sora-2-pro-hd | Video | $0.60 | per second |
| routehook/omni-flash | Video | $5.00 | per second |
| xai/grok-video | Video | $4.00 | per second |
| google/nano-banana-2 | Image | $29 | per image |
| google/nano-banana-2-lite | Image | $29 | per image |
| google/nano-banana-pro | Image | $2.80 | per image |
| meta/meta-ai-image | Image | $7.00 | per image |
| openai/gpt-image-2 | Image | $0.152 | per image |
| xai/grok-image | Image | $5.00 | per image |
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 used and reference_value. What the same call costs at the vendor's list price. That pair is the saving, measured per request rather than asserted per month.
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.
- Reading the catalogue, a job's status, the key, the balance or the status page.