Appearance
Limits
Every limit is enforced server-side and scope-labeled. Two kinds exist: plan limits, which differ by plan, and fixed bounds, which are the same for everyone.
Plan limits
| Limit | Scope | Solo | Team | Business |
|---|---|---|---|---|
| Spools | account | 1 | 2 | 3 |
| Replicas | spool | 1 | 2 | 3 |
| Queues | spool | 1,000 | 10,000 | 100,000 |
| Stored messages | spool | 100,000 | 250,000 | 500,000 |
| Stored payload bytes | spool | 2.0 GiB | 4.0 GiB | 8.0 GiB |
| Retention cap | queue | 7 days | 14 days | 30 days |
| Request rate | account | 250/s | 500/s | 1,000/s |
| Request burst | account | 250 requests | 500 requests | 1,000 requests |
Replicas is the number of nodes holding the spool's data, primary included: a single replica is a single copy; with more than one, another node becomes the primary when one is lost, and whether every acknowledged write is on it depends on the spool's numSync — see Replication.
Stored messages and payload bytes count everything on the spool: visible, delayed, pending, and failed messages across all queues. When either cap is reached, sends fail with 507 kind spool_full — backpressure, not billing: receive and ack (or delete queues) to make room, then retry. Failed messages hold their share too, and receive never returns them: recover them for processing or discard them to free the space — see failed messages.
The queue limit refuses Create a queue with 403 kind queue_limit. The retention cap bounds what retentionSeconds a queue may set: asking for more fails with 403 kind retention_limit, and the applied value is always visible as the queue's read-only effectiveRetentionSeconds.
Fixed bounds
| Bound | Scope | Value |
|---|---|---|
| Message size | message | 64 KiB |
Send delay (Spooler-Delay-Seconds) | message | ≤ 604,800 s (a week) |
Receive long-poll (waitSeconds) | request | ≤ 20 s |
| Lease timeout | queue | ≤ 1 year; 0 disables; default 5m |
| Max retries | queue | ≤ 65,535; default 10 |
| Dedup window | queue | ≤ 300s; default off |
| Dedup key | message | 1–128 printable ASCII chars |
| Retention | queue | ≥ 60s; capped by plan |
| Receive rate limit | queue | optional; sustained at most 100 msg/s (interval ≥ 10ms) |
| Spool and queue names | name | 1–63 chars matching ^[A-Za-z0-9_:-]+$ |
| Lease and handle | token | ≤ 256 chars, opaque |
| Message id | message | ≤ 256 chars, opaque |
| Cursor | request | ≤ 256 chars, opaque |
| Queue listing page | request | ≤ 1,000 queues; default 100 |
A message over the size limit fails with 413 kind payload_too_large before the body is read.
Queue settings left unset take server defaults; the values in force are returned by List queues.
Request rate
The plan's request rate caps requests of every kind, per account, across all API keys: a token bucket refilled at the sustained rate, holding up to the burst — both in the plan table above. Exceeding it fails with 429 kind rate_limited and a Retry-After header naming the seconds to wait.