> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arena-predictions.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits

> Per-account limits by plan, per minute and per calendar month.

<Info>
  Limits are counted but **not enforced** today: nothing is refused. The enforcement date will be announced in the [changelog](/changelog) first.
</Info>

## Plans

| Plan | Per month | Per minute |
| - | - | - |
| No plan (any signed-in account) | 1,000 | 30 |
| Arena Basic | 10,000 | 60 |
| Builder *(not on sale yet)* | 100,000 | 120 |
| Desk *(not on sale yet)* | 1,000,000 | 600 |
| Enterprise | Set per account | Set per account |

Limits apply to the account, across all its keys. The month is the UTC calendar month.

## What counts

* Every keyed request counts as one.
* `GET /quotes` counts one per instrument id.
* Never counted: `GET /usage`, `GET /status`, `GET /openapi.json`, key management.
* A refused request is not counted.

## Headers

Every keyed response carries:

| Header | Meaning |
| - | - |
| `RateLimit-Limit` | Plan's requests per minute. |
| `RateLimit-Remaining` | Requests left this minute. |
| `RateLimit-Reset` | Seconds until the minute resets. |
| `Arena-Quota-Limit` | Plan's requests per month. |
| `Arena-Quota-Remaining` | Requests left this month. |
| `Arena-Quota-Reset` | Seconds until 00:00 UTC on the 1st. |
| `Arena-Plan` | `none`, `basic`, `builder`, `desk` or `enterprise`. |

[`GET /usage`](/api-reference/usage/get-usage) returns the same in a body, plus this key's own count and `enforced`.

Unkeyed calls (`GET /status`, or a missing or bad key) carry advisory `RateLimit-*` headers at 60 per minute per IP. Nothing is refused on them.

## When enforced

| Response | Cause | Retry |
| - | - | - |
| `429 rate_limited` | Over the minute limit. | After `Retry-After` seconds. |
| `429 quota_exceeded` | Over the month. | `Retry-After` runs to 00:00 UTC on the 1st, or upgrade the plan. |

Both carry `Retry-After` and `error.retryAfterSeconds`.
