Limits
The API is free and unauthenticated, so it is bounded. Every number below is read from the same file the API enforces, so this page cannot drift from the guard.
What OpenDice enforces
Section titled “What OpenDice enforces”These hold whether you call the API or use the package directly.
| Limit | Value |
|---|---|
| Dice per roll | 1000, counted across every term |
| Explosions per die | 100 |
| Formula length | 1000 characters |
| Bonuses per roll | 100 |
| Largest total | must stay an exact whole number |
A formula that asks for more dice than that is refused rather than truncated. Past 2^53 JavaScript stops counting exactly, so a total beyond it would be quietly wrong rather than large.
What the API adds
Section titled “What the API adds”| Limit | Value |
|---|---|
| Request body | 8 KB |
| Formula length | 200 characters |
| Bonuses per roll | 20 |
| Tags per roll | 20, each at most 32 lowercase letters |
| Rolls per batch | 20 |
| Dice per request | 1000, counted across every roll in a batch |
| Rate limit | 60 requests every 60 seconds, per address |
The formula limit is shorter than the package’s because this is the public tier. Formulas that long are generated rather than typed.
How dice are counted
Section titled “How dice are counted”Across a whole request, not per roll. A batch of 20 rolls asking for 100 dice each is 2000 dice and is refused, though each roll would be legal alone.
The count comes from the parsed formula rather than from the roll, so a formula is charged
for every die it throws rather than for the dice it keeps: 4d20adv costs four. The API
parses every formula in a request, sums the dice, and refuses before rolling anything.
How the rate limit is counted
Section titled “How the rate limit is counted”Per address, and per Cloudflare location rather than globally — so the number reachable worldwide is higher than 60, and a retry may succeed sooner than the window suggests. It is a guard against abuse rather than a quota to plan against.
period accepts only 10 or 60 seconds, so the window is not freely adjustable.
Working within them
Section titled “Working within them”Survive the limits covers backing off a 429, splitting a batch to stay inside the dice budget, and what each refusal means for a retry.
The package enforces only the first table. It has no rate limit and no request budget, because it is not sharing a server with anyone — Package or API weighs that against what the API gives you.