The cost of an AI video is more than the charge for one successful generation. You also need to budget creative variations, abandoned attempts and the work required to recover a request after a timeout. A useful budget starts before the first paid submission.
This guide explains Raywake's quote and credit flow, then shows how to estimate cost per approved clip. The numerical examples are hypothetical planning examples, not current model prices. Use a live quote for the model and input you actually intend to run.
What does a quote tell you?
A Raywake quote returns the credits to reserve for one exact model and input, along with a quote_id and expires_at. Requesting it does not start a generation or charge generation credits. The quote is valid for up to 10 minutes; check its returned expiry rather than assuming you always have the full window.
For a fixed-price model, the quoted amount describes the charge for that input. For a usage-billed model, it is an upper bound: generation reserves enough to cover the permitted usage, then settlement captures measured usage and releases the remainder. The credits documentation explains both paths.
Key takeaways
- Quote the final input, including settings that affect the price.
- Keep the quoted payload unchanged when generating.
- Reserve a budget for creative variations as well as the first attempt.
- Save one idempotency key per intended generation before submitting.
- Continue tracking an uncertain job instead of automatically buying a replacement.
How do reserved credits differ from spent credits?
Starting a job reduces your available balance because credits are held for that job. A hold is not yet the final charge. Settlement determines what is captured or released.
Suppose a hypothetical usage-billed job holds 100 credits and settles at 80. The final charge is 80 credits, and the remaining 20 are released. These numbers illustrate the accounting; they do not price a particular video model.
| Stage or outcome | Meaning for your budget | Next action |
|---|---|---|
| Quote created | No generation charge | Confirm input and quote expiry |
| Job queued or submitted | Credits held | Track the existing job |
| Job finalizing | Credits captured; outputs being saved | Continue polling |
| Job succeeded | Charge settled and outputs available | Review and download the result |
| Job failed | Reserved credits released | Read the error before deciding on a new attempt |
| Submission unknown, review or reconciliation needed | Credits remain held pending resolution | Track the job and resolve its state before replacing it |
The last row matters. An unclear outcome is not the same as a failed generation. A second job can add a second hold while the first is still unresolved. Use the exact generation statuses rather than grouping every non-success response under “failed.”
Price the final payload before running it
Duration, resolution, output count and audio options can affect cost, depending on the selected endpoint. Read its schema, choose the final settings and obtain a quote for that payload. If you change a field afterwards, request a new quote.
The example below quotes a text-to-video input without starting generation. It uses Veo 3.1 Fast, with the customer model ID veo3.1/fast and needs a key with generate permission. The response gives the current quote; this article does not hard-code a credit price.
curl --fail-with-body https://api.raywake.com/v1/quotes \
-H "Authorization: Bearer $RAYWAKE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"veo3.1/fast","input":{"prompt":"A perfume bottle on a stone table. Slow camera push in, soft window light, one continuous shot."}}'Store the returned quote with the exact payload if the user is going to approve the run. If approval comes after expiry, obtain another quote and show the updated amount before submitting. The quotes reference lists the response fields.
How should you recover from a timeout?
A timeout tells you the client stopped waiting. It does not prove that the server rejected the job. If you create a new idempotency key and submit again, you are requesting a new generation.
Before sending the paid request, persist the model, input, quote ID and idempotency key. Save the job ID as soon as it is returned. For an interrupted submission, retry the same body with the same key; if you already have a job ID, continue polling that job. A reused key with a different body returns 409 rather than silently turning into a new request.
There are two different kinds of retry:
| Retry | What changes? | Why it matters |
|---|---|---|
| Recover the same intended submission | Keep body and idempotency key | Resume the existing request |
| Make a new creative attempt | New input or deliberate new run, new quote and key | This is another paid generation |
Keep these actions distinct in your interface. “Check status” should not start a new clip. “Generate another version” should show the new quote and count towards the creative budget. A polling timeout can return a “still running” state to your application while the saved job remains available for later checks.
Budget for approved clips, not just successful jobs
A successful job means media was produced. It does not mean the editor approved it. A clip can be technically valid and still have an unwanted camera move, distorted lettering or poor continuity.
Consider a hypothetical brief for eight final clips, with a planning allowance of two paid attempts per approved clip and a quoted upper bound of 60 credits per attempt:
8 clips × 2 attempts × 60 credits = 960 credits of planned generation capacity
This is a budget illustration, not a guarantee that two attempts will be enough. Increase or reduce the allowance using your own acceptance record. Keep any image generation, speech, upscaling or later edits as separate line items; they are not included in that multiplication.
After the project, calculate actual generation credits captured divided by the number of approved clips. That figure exposes a workflow with cheap attempts but many rejected results. Keep reserved credits separate while unresolved jobs are still open, so the report does not call a temporary hold a completed expense.
Reduce waste before making more variations
Approve the starting frame before animation. Simplify the shot to one main subject action and one camera move. Review the complete first clip, then change one variable in the next attempt. Those habits make it easier to identify the cause of a rejected result.
For a larger run, save a small approved set of prompts, input images and settings, then scale gradually. Record rejection reasons such as subject drift, framing or incorrect movement. This gives you a concrete improvement target instead of buying another batch with the same unresolved problem.
Raywake's rate limits and spending controls describe hourly and 24-hour limits managed from the studio. Use them as a guardrail alongside your project's own attempt budget. A spending limit does not replace checking the quote for each intended run.
Keep the accepted output
Download results you want to retain. Raywake stores generated media for 30 days, and signed links last 7 days; fetch the job again to refresh an expired output link. Your editing and publishing pipeline should use a retained copy under your control.
For a concrete creative workflow, start with turning an image into a video. For choosing the surrounding integration, read fal.ai vs Replicate vs Raywake.
Plan a run in the studio Read the API quickstart