Limits & plans
Plan limits for operations, agents working at once, spaces, active runs and jobs, request rate, input and result size and retention, plus per-space limits and hard bounds.
Every limit in this table is counted across the whole organization, not per space, so splitting work into more spaces never buys more capacity. During the developer preview, new organizations start on the Free plan. There is no self-serve upgrade yet; talk to us to change plans.
| Free | Builder | Team | Scale | Enterprise | |
|---|---|---|---|---|---|
| Operations per month | 100,000 (hard stop) | 2,000,000 | 15,000,000 | 100,000,000 | custom |
| Agents working at once | 10 | 100 | 1,000 | 5,000 | custom |
| Spaces | 2 | 10 | unlimited | unlimited | custom |
| Active runs | 200 | 1,000 | 10,000 | 50,000 | custom |
| Active queue jobs (pending or running) | 1,000 | 10,000 | 100,000 | 500,000 | custom |
| API keys (not revoked) | 10 | 25 | 100 | 500 | custom |
| Requests per minute (whole organization) | 600 | 1,500 | 3,000 | 20,000 | custom |
| Input or result size | 64 KB | 64 KB | 64 KB | 64 KB | 64 KB |
| Data retention | 7 days | 14 days | 30 days | 90 days | custom |
Organizations created before plans existed are on a legacy Preview plan: 3 spaces, 200 active runs, 1,000 active jobs, 10 keys, 600 requests per minute, 64 KB inputs and results, 7-day retention, and no cap on operations or agents working at once.
Operations
Section titled “Operations”An operation is a successful call that changes state: starting a once call and recording its result, taking limit units or a slot, reserving and charging budget, submitting and finishing a queue job, and so on. These are never counted:
- lease renewals,
- reads (status, results, events),
- waits that return nothing,
- failed calls,
- idempotent replays of work that already happened.
On the Free plan, new work is refused with OPERATIONS_EXHAUSTED once the month’s operations are used; work already running can still finish. Paid plans are tracked, not blocked.
Agents working at once
Section titled “Agents working at once”This counts live leases across the organization: once calls in progress, queue jobs being handled and held slots. It’s a soft limit (counts are cached briefly), so treat it as “about” the number shown. The SDKs wait and retry when you reach it.
Request rate
Section titled “Request rate”Two limits apply to every request, and a request has to pass both:
- Organization. The plan’s requests per minute are one shared count for the whole organization, across all its spaces and keys. Going over returns
SERVICE_RATE_LIMITEDuntil the next minute. 20% of that capacity is reserved for calls that renew, hand back or finish work, so new work can’t starve them. - Space. Each space also has a
requestsPerMinutelimit, which returnsRATE_LIMITED. Unless you set it, it follows the plan’s rate. It exists so you can hold one space below the organization’s rate, for example so a noisy test space can’t use up the requests production needs; it can’t be set above the plan. The same 20% recovery reserve applies within the space. It’s enforced by each API server separately, so treat it as approximate. See per-space limits.
Two kinds of request are given back to both counts once they finish, so keeping held work alive and idle workers waiting don’t use up the rate: successful lease renewals, and long-polling waits for work that came back empty. They still count while they are in flight, so the limits also cap how many can run at once. serve() long-polls, so an idle worker makes about three requests a minute. The SDKs retry rate-limited calls for you, honouring Retry-After.
Retention
Section titled “Retention”once results, queue job inputs and results are kept for the plan’s retention window. After that a job’s state and reason stay readable and its result is cleared. The event journal is kept for the longer of the plan window and 30 days. Audit events are kept for 365 days and usage records for 400 days regardless of plan.
Per-space limits
Section titled “Per-space limits”Each space also has operational limits, readable with GET /v1/spaces/{spaceId}/limits (key permission usage_read) and adjustable with PUT (key permission resource_config):
| Limit | Default | Allowed | Notes |
|---|---|---|---|
requestsPerMinute |
the plan’s requests per minute | 1–100,000 | Can’t exceed the plan’s requests per minute. Exceeding it returns RATE_LIMITED. |
maxBacklog |
1,000 | 1–1,000,000 | Queued plus in-progress queue jobs across the space. Exceeding it returns BACKLOG_FULL. |
maxPayloadBytes |
65,536 | 1–65,536 | Can’t exceed the plan’s input and result size (64 KB). |
maxLeaseSeconds |
600 | 5–600 | Longest lease in seconds. |
maxPendingWaiters |
10,000 | 1–1,000,000 | |
maxArmedTimers |
10,000 | 1–1,000,000 | Pending sleep timers. |
A space you haven’t set requestsPerMinute on follows the plan, including after a plan change. Setting it pins the space to that value, and all spaces still share the organization’s count. To hold a space below the plan:
curl -X PUT "$RUNSTATE_BASE_URL/v1/spaces/$RUNSTATE_SPACE_ID/limits" \ -H "Authorization: Bearer $RUNSTATE_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"requestsPerMinute": 300, "maxBacklog": 10000}'A value above the plan ceiling returns ENTITLEMENT_EXCEEDED. If the organization moves to a plan with a lower rate, pinned values above it are lowered to the new plan’s rate.
Bounds
Section titled “Bounds”Fixed bounds enforced on every call:
| What | Bound |
|---|---|
Input or result of once and queue jobs |
64 KB of JSON |
once and queue key |
1–512 characters |
lease |
5–600 seconds, default 30 |
once attempts |
default 3 |
| Queue job attempts | default 5 |
limit and slots wait (timeout) |
default 60 seconds |
| Request timeout | default 30 seconds |
| Child runs per run | 1–10,000, default 1,000 |
Inputs per gather |
100 |
need in gather |
1 to the number of inputs (at most 100), or 'all' |
| Budget currency / scale | 3 letters / 0–9 decimal places |
| Budget amounts | up to 18 digits in minor units |
Idempotency-Key replay window (HTTP API) |
24 hours |
All durations are in seconds unless you pass a string such as '10m'.
Service status
Section titled “Service status”The hosted service is a developer preview in a single EU region, without an SLA.