Plans and limits
Three layers apply to every call: a limit per account from its plan, request buckets per key, and credit caps per key and per project. The lowest one that applies is the one you hit.
Limits per plan
Each account has a ceiling on batches that are active at once and on batches submitted per hour, set by its plan. The plan is read from the active subscription's plan name up to the first hyphen, so studio-monthly and studio-annual are both Max (its internal plan id is studio). An account with several active subscriptions gets the most generous one.
| Plan | Active batches | Submits per hour |
|---|---|---|
| Max | 20 | 30 |
| Pro | 8 | 12 |
| Creator | 3 | 12 |
| Any other active plan | 3 | 12 |
| No subscription (free account) | 0 | 12 |
| Administrator accounts (Myrlin operations) | 20 | 60 |
A canceled or failed submit still counts toward the hour. A repeat of the same Idempotency-Key does not. Batches the service creates itself, such as the parts of a split manifest and free fix batches, do not count as submits.
Request buckets per key
| Bucket | Limit | Used by |
|---|---|---|
read | 240 a minute | GET routes |
write | 60 a minute | PUT and cancel, quote, lint, reviews, notifications writes |
upload | 8 an hour | Input and evidence ZIP uploads |
submit | 12 an hour | Starting a batch |
A signed-in session is counted per user in the same buckets. Over a bucket, the answer is 429 rate_limited with a Retry-After header. A single key can submit at most 12 batches an hour even where the plan allows more; the plan limit and the key bucket both apply, and the lower one binds. GET /pricing reports both for your account.
Separately, 20 requests with unknown keys from one address within 10 minutes are answered 429 too_many_failed_auth.
Active batches
Active means queued, running, packaging, canceling. A new submit over the plan limit answers 429 active_batch_limit with a Retry-After of 60 seconds. The key's own maxActiveBatches (default 20, at most 20) answers the same code. A batch frees its slot when it ends, which no request can predict, so the retry time is a polite interval, not a promise.
Credit caps and project budgets
A priced quote is held against three ceilings when you submit. The quote response carries caps, which shows what would bind, so you can split a batch before you submit it.
| Ceiling | Where it is set | Refusal |
|---|---|---|
| maxCredits on the submit | You, on every submit. The quote must fit under it. | 402 credit_ceiling_exceeded |
| Per-batch cap of the key | The key's perBatchCreditCap, 0 if omitted | 402 key_batch_credit_cap |
| Daily cap of the key | The key's dailyCreditCap, 0 if omitted. The day is a UTC day. | 402 key_daily_credit_cap |
| Project budget | Default 500 credits per project. Set it with budgetCredits on PUT /projects/{slug}. Above 1,000 needs an administrator account. | 402 project_budget_exceeded |
Credits held by a batch count against the budget and the daily cap until the batch ends. Deterministic work costs 0, so these ceilings only matter for priced lanes. See Pricing per lane.
Size and retention limits
| What | Limit |
|---|---|
| A manifest in one batch | 8 MB, 25,000 files, 4,000 compute units, 240 characters per path |
| A larger manifest where streamlining is on | 64 MB, 200,000 files, 32,000 compute units; it is split into at most 128 child batches |
| An input ZIP | 32 MB compressed, 256 MB expanded, 30,000 entries, 8 MB per entry |
| A PNG input | 16,384 pixels a side and 4,194,304 pixels in all |
| A result ZIP | 128 MB. Larger results answer 409 result_too_large; split the manifest. |
| Input sets are kept | 30 days |
| A batch expires | 14 days after it is created |
| A result ZIP is kept | 30 days. A download link from result-url lasts at most 15 minutes. |
Handling a 429
These codes use 429. Each carries a Retry-After header in seconds. Wait that long, then repeat the same request.
| Code | Cause |
|---|---|
rate_limited | A key bucket is used up. |
plan_submit_limit | The account used its plan's submits for the hour. The wait is until the oldest counted submit leaves the hour. |
active_batch_limit | The account or the key has the most active batches it may have. |
too_many_failed_auth | Too many requests with unknown keys from this address. |