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 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 IDCATEGORYPRICEUNIT
bytedance/seedance-2Video$7.00per second
bytedance/seedance-2-omniVideo$7.00per second
google/veo-2Video$2.80per second
google/veo-3.1Video$1.40per second
google/veo-3.1-fastVideo$29per second
google/veo-3.1-liteVideo$20per second
kling/kling-video-2-5Video$7.00per second
kling/kling-video-2-6Video$7.00per second
kling/kling-video-3-0Video$5.60per second
openai/sora-2Video$0.10per second
openai/sora-2-proVideo$0.30per second
openai/sora-2-pro-hdVideo$0.60per second
routehook/omni-flashVideo$5.00per second
xai/grok-videoVideo$4.00per second
google/nano-banana-2Image$29per image
google/nano-banana-2-liteImage$29per image
google/nano-banana-proImage$2.80per image
meta/meta-ai-imageImage$7.00per image
openai/gpt-image-2Image$0.152per image
xai/grok-imageImage$5.00per 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.