Limits

These are the limits that refuse or delay a render. Triangle counts and texture sizes only warn, and they are under Scene size.

LimitValue
Renders running at once1 before your first top-up, 2 on pay-as-you-go, 5 on Studio, 15 on Production, 40 on Scale
Renders waiting in the queue50 per account
Time a render can wait24 hours
Frames in a video1800
Objects in a bake256
Texels in a bake32 × 1024²
How long results are kept30 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.

LaneWhat is in it
interactiveEvery render made with a browser token. This is what the SDK's render() makes by default.
normalA POST /v1/renders made with a secret key.
batchAn 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:

  1. maxCost on the render. Your own ceiling for this one render.
  2. 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.
  3. The account's monthly limit. Optional. You set it at bakery3.com/settings. It refuses renders and does not only warn you.
  4. 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.

CodeAttemptsWhen
WorkerFailure3The worker answered 5xx, or died mid-render.
WorkerLost3The worker stopped answering.
UploadFailed3The result never reached storage.
ResultLost2The worker reported success with no file.
RendererCrashed2The renderer process died. Twice on two machines points at the scene.
RenderTimeout2Only if the attempt never reached rendering.
OutOfVideoMemory2Only 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.