A token budget answers a single question: can I afford this call? Providers enforce a different question: how many calls may exist at once. OpenAI documents its limits as restrictions on how often a user or client can access the service in a period, and states that those limits are set per organization and project. Those limits are not configurable by you and come in at least two dimensions that matter here: tokens per minute (TPM) and requests per minute (RPM). A per-run dollar cap is invisible to both.
That distinction has a practical consequence. The per-run budget controller pattern prices each request's worst case, holds it against a run-scoped balance, issues the call, and refunds the difference after settlement, so the run halts before a call it cannot afford (per-run budget reservation). Notice what it does not do: it has no opinion about how many of those affordable calls you have open. If you fan out 200 workers against a plan that allows 50 concurrent requests, 150 of them are admissible on spend and blocked on throughput.
The second ceiling bites first precisely because it is cheap to hit. Fan-out multiplies request count without multiplying token volume per request. Five parallel workers reading five different files each send a modest prompt; that is five requests toward the RPM ceiling and a rounding error against the TPM ceiling. The subagent fan-out discussion makes the inverse point well: each spawned agent pays fixed per-agent context overhead, so fan-out is expensive in tokens too, but the requests are what the provider counts first when the ceiling is a request count rather than a token count.
So treat the two as separate reservations with separate failure modes:
| Reservation | What it protects | Unit | Typical exhaustion signal | Release condition |
|---|---|---|---|---|
| Spend | Cumulative cost per run or tenant | Dollars, held at worst-case rate | BudgetExceeded before dispatch | Settlement, refund the delta |
| Concurrency | In-flight requests against a provider ceiling | Slots | Wait or reject before dispatch | Response, error, or timeout |
| Queue key | Ordering and de-duplication per logical unit | String key | Duplicate key rejected at admission | Task terminal state |
The spend hold is a number. The concurrency token is a lease. The queue key is an identity. All three must be acquired before the request leaves your process, and none of them is a substitute for the others.



