Limits
These are the limits that refuse or delay a render. Triangle counts and texture sizes only warn, and they are under Scene size.
| Limit | Value |
|---|---|
| Renders running at once | 1 before your first top-up, 2 on pay-as-you-go, 5 on Studio, 15 on Production, 40 on Scale |
| Renders waiting in the queue | 50 per account |
| Time a render can wait | 24 hours |
| Frames in a video | 1800 |
| Objects in a bake | 256 |
| Texels in a bake | 32 × 1024² |
| How long results are kept | 30 days by default, 1 to 365 per project |
How many renders run at once
The number in the table is per account, across all its projects. A render over
the limit is not refused. It waits in queued and starts when one of your
slots frees, oldest first. A render that has waited 24 hours fails with
QueueTimeout and costs nothing.
The queue holds 50 waiting renders per account. The next one is refused:
QueueFull: You already have 50 render(s) waiting; the queue holds
50 per account.
Why: Queued renders dispatch automatically as your concurrency slots free up.
Fix: Wait for queued renders to start, cancel some, or ask us about a
higher-concurrency plan.For more than 50 renders, use a batch. Its items wait behind
the queue and are fed in as it empties, so a batch is never refused as
QueueFull.
Lanes
Your waiting renders are in one of three lanes. A higher lane always starts before a lower one, so a visitor in your configurator never waits behind an overnight catalog.
| Lane | What is in it |
|---|---|
interactive | Every render made with a browser token. This is what the SDK's render() makes by default. |
normal | A POST /v1/renders made with a secret key. |
batch | An item of a batch, unless the batch was opened with lane: 'normal'. |
Inside a lane the oldest render starts first. priority: 'high' on a render
moves it ahead of your other renders in the same lane, for example a hero shot
before the rest. It never moves a render to another lane. The render record
says which lane a render is in (lane).
While a batch runs, we keep some of your slots free for interactive and normal
renders: one slot for every five you have, and at least one unless you have
only one. A Scale account (40) keeps 8 and a Studio account (5) keeps 1. When
the account has made nothing but batch renders for ten minutes, the batch gets
every slot. Set maxParallel on a batch to run fewer items at once.
What refuses a render for money
A render is refused before it starts, and costs nothing, when one of these says no:
maxCoston the render. Your own ceiling for this one render.- Your credit. The render's maximum price must fit in your plan credit plus your balance. The maximum of every render we already accepted is set aside until that render ends, so a full queue cannot overdraw either.
- The account's monthly limit. Optional. You set it at
bakery3.com/settings. It refuses renders and does not only warn you. - The project's monthly limit. Optional, per project.
InsufficientBalance: This render could cost up to $0.16 and you have $0.10 available. Top up at https://bakery3.com/billing.QuotaExceeded: This render would take you past your $200.00 monthly limit
(you have spent $184.20).
Why: You set this limit yourself. It is a hard stop, not an alert.
Fix: Raise or remove the monthly limit at bakery3.com/settings.Video
A video can have at most 1800 frames, which is a minute at 30 fps. The frame count is checked before anything is uploaded.
An mp4 needs an even width and height.
Baking
A bake can cover 256 objects and 32 × 1024² texels in total. A texture is 256, 512, 1024 or 2048 pixels wide. Eight objects at 2048² use the whole texel limit, so a bake can be over it even when every texture size is valid. Both limits are checked by the SDK and again by the API.
Scene size
Triangles and textures warn and do not refuse. A scene that does not fit in the
GPU's memory fails with OutOfVideoMemory. Reduce triangles or texture bytes,
whichever is larger. See Scene size.
Timeouts
A render that runs too long fails with RenderTimeout. Use fewer samples or a
smaller output, or split the video. In practice this is an ultra render of a
very large scene at 4K.
Retries
When a render fails on our side, we run it again for you. The render goes back
to queued and starts on a different worker after 5 seconds, then 30 seconds.
attempts on the record counts the tries, and 1 is normal. The SDK's job keeps
waiting through a retry.
| Code | Attempts | When |
|---|---|---|
WorkerFailure | 3 | The worker answered 5xx, or died mid-render. |
WorkerLost | 3 | The worker stopped answering. |
UploadFailed | 3 | The result never reached storage. |
ResultLost | 2 | The worker reported success with no file. |
RendererCrashed | 2 | The renderer process died. Twice on two machines points at the scene. |
RenderTimeout | 2 | Only if the attempt never reached rendering. |
OutOfVideoMemory | 2 | Only when the renderer ran out of memory, not when we predicted it. The retry runs on a larger GPU, and only when we have one. |
You never pay for a failed attempt. Only the attempt that completes is charged, and the charge is still capped at the maximum the render was accepted under.
We do not retry a refusal such as UnsupportedMaterial or SceneTooLarge, or a
timeout while rendering. The answer would be the same, so the render fails at
once and the error says what to fix. CapacityUnavailable means no worker was
free. The render stays queued, and this does not count as an attempt.
When every attempt fails the same way, the render fails with
error.attemptsExhausted: true and we are notified. Once we have fixed the
cause, POST /v1/renders/:id/retry runs it again. See
Troubleshooting.
Retention
Results and previews are deleted when the project's retention ends. That is 30
days by default, and you can set 1 to 365 days per project. Until then you read
them on signed URLs that work for 24 hours, and reading the render again
(getRender(id) in the SDK) gives fresh ones. Copy what you need into your own
storage. The webhook handler is a good place for that.
To delete sooner, call DELETE /v1/renders/:id with a secret key or press
Delete in the console. The files are removed at once. The render record, with
its cost, GPU seconds and timeline, stays either way.
Files you uploaded are kept, so a later render of the same scene uploads nothing. A file no render has used for the retention time (never less than two days) is deleted, and the next render that needs it uploads it again.
Rate limits
Requests are counted per minute, per credential. A secret key may make 600
calls a minute, 120 of them calls that create work: starting a render or a
bake, opening a batch or adding a page to one, checking assets, importing a
URL, minting a token. A browser token may make 120 calls a minute, 30 of them
work-creating. Over the limit a call answers 429 with a retry-after
header, and the SDK waits and tries again on its own. If it is still refused
after five tries, the SDK throws RateLimited. POST /v1/estimate is
free of charge but counts as a call, and check() runs in the browser and
counts as nothing.
The API also counts calls per client address in front of the key check, so a script sending bad keys is slowed before it costs anything. A catalog is fastest through batches: one call admits a whole page.
Ask for a higher limit
We can raise your concurrency for a workload we know about. Tell us how many renders you expect, the output sizes, and whether they come from a batch or from users.
