Skip to main content

AI Generation Pricing

Generation is paid for in credits, from the same balance as rendering. Each generation is priced at what the model's provider charges for that request, plus a small margin, converted to credits. Generation is here so you can use these models without a separate provider account or integration, and its price stays close to the provider's own.

Get a quote​

POST /generate/quote takes the same body as the generate endpoint and returns what that generation would cost. Nothing is generated, reserved or charged.

curl -X POST \
-H "Content-Type: application/json" \
-H "x-api-key: $SHOTSTACK_API_KEY" \
-d '{"asset": {"type": "video", "prompt": "Waves rolling onto a black sand beach", "model": "seedance-2.0-text-to-video", "options": {"resolution": "720p"}}, "length": 8}' \
https://api.shotstack.io/edit/stage/generate/quote
{
"credits": 15.1696,
"ceiling": false
}

To price a clip in an edit, send its asset and its numeric length.

ceiling is true when the request has no length for a model that is charged by length. The quote is then an estimate.

A quote is worked out when you ask for it. It doesn't hold credits, and prices follow the providers' prices, so ask again rather than storing one.

What each model's price depends on​

ModelCharged perPrice changes with
nano-banana-2, nano-banana-2-editImageresolution: 0.5K, 1K (default), 2K, 4K
nano-banana-proImageresolution: 1K (default), 2K, 4K
gpt-image-2.5-sunburstImageresolution: 1K (default), 2K, 4K
gpt-image-2.5-sunburst-editImage, plus each reference imageresolution: 1K (default), 2K, 4K
flux-schnellImageFixed price
seedance-2.0-text-to-video, seedance-2.0-image-to-videoSecond of video, 4 to 15resolution: 480p, 720p (default), 1080p
seedance-2.5-text-to-video, seedance-2.5-image-to-videoSecond of video, 4 to 30resolution: 480p, 720p (default), 1080p
wan-3.0-prime-text-to-video, wan-3.0-prime-image-to-videoSecond of video, 2 to 30resolution: 480p, 720p, 1080p (default)
gemini-omni-flash-1.1-text-to-video, gemini-omni-flash-1.1-image-to-videoSecond of video, 3 to 10resolution: 360p, 720p (default), 1080p, 4k
elevenlabs-multilingual-v2, elevenlabs-turbo-v2.5, minimax-speech-2.8-hdCharacter of the promptFixed rate
polly-neuralCharacter of the prompt, minimum 100Fixed rate
elevenlabs-musicStarted minute of music, up to 10 minutesFixed rate

Video is charged per whole second, rounded up. A length outside a model's range is generated and charged at the nearest end of it: a 2-second Seedance clip is a 4-second generation.

Music is charged per started minute, so a 30-second track and a 60-second track cost the same, and a 61-second track costs two minutes.

When a quote is an estimate​

For video and music, a quote is exact when the length is known up front: a clip with a numeric length, or a request with length. It is a best estimate when the length isn't known until the asset is generated:

  • The clip uses a smart clip length, "auto" or "end".
  • The request has no length.
  • The asset depends on another clip through an alias.

The estimate assumes the model's default length. The final charge follows the actual length of the generated asset, so it can be higher or lower than the quote.

ModelDefault length
Seedance 2.0 and 2.515 seconds
Wan 3.0 Prime5 seconds
Gemini Omni Flash 1.18 seconds
ElevenLabs Music30 seconds

When generation is free​

  • It was generated before. An asset identical to one already stored costs nothing. See reusing earlier generations for what counts as identical. In a render, this applies to assets stored before the render starts.
  • The generation failed. A failed generation isn't charged. If a render fails after some of its assets were generated, those assets are charged and kept, and rendering again reuses them at no charge.
  • The asset has no prompt. An asset with only a src is never generated.

The sandbox​

Generation in the sandbox is charged like production, from your production credit balance. Sandbox renders stay free and watermarked, but the assets they generate are not. The two environments store generations separately, so an asset made in the sandbox is charged again the first time production generates it.

Seeing what you were charged​

In production, a render's status response includes credits, the total for rendering and generation together. The sandbox omits it. Your credit usage is in the dashboard.

Access​

AI generation needs a plan that includes it. If yours doesn't, generation requests return 403 with a code saying why, and GET /models marks each model "available": false with an unavailableReason.

ResponseMeaning
402Your balance is too low for this generation. available shows your balance.
403Your plan doesn't include this generation, or AI generation is turned off for the account.
503Access or billing couldn't be checked. Retry after the Retry-After header.

A render that runs out of credits while generating fails with the reason in its error.