# Tiers and limits

Every Quantis v3 account has a tier. A tier sets two limits: a **monthly quota** (how many requests you can make in a calendar month) and a **rate limit** (how many requests you can make per second). See [center.quantis.vzla.io](https://center.quantis.vzla.io) for the current tiers and to change yours.

## Monthly quota

- The quota belongs to your **account**, not to a key. All the keys on your account share the same counter.
- Every call counts **1 request**, except [My Quota](/quantis/v3/me/quota/), which is free.
- The counter resets on the **1st of each calendar month at 00:00, Caracas time** (America/Caracas).
- Some tiers have no monthly quota. On those, [My Quota](/quantis/v3/me/quota/) returns `null` for `monthly_quota`, `remaining` and `usage_percentage`.

Check where you stand at any time with [My Quota](/quantis/v3/me/quota/). Its `status_level` moves from `normal` to `warning` at 70%, `critical` at 90% and `exceeded` at 100%.

## Rate limit

Every tier has a rate limit, shown in the `rate_limit` field of [My Quota](/quantis/v3/me/quota/) as `<requests>/<period>`, e.g. `"60/m"`. It applies to every call, including My Quota. A request blocked by the rate limit does not use your monthly quota.

## Handling 429

Both limits answer with `429 Too Many Requests`. Read `error.code` to tell them apart:

| Error code | What happened | What to do |
|---|---|---|
| `quota_exceeded` | Your account spent its monthly quota | Stop calling until the 1st of next month, or move to a tier with more requests |
| `throttled` | You sent requests faster than your rate limit | Wait the number of seconds in the `Retry-After` header, then retry |

### quota_exceeded

```json
{
  "error": {
    "code": "quota_exceeded",
    "message": "Monthly quota exceeded. It resets on the 1st of next month."
  }
}
```

Retrying will not help: every call returns the same error until the counter resets. Use `reset_at` from [My Quota](/quantis/v3/me/quota/) to know when.

### throttled

```http
HTTP/1.1 429 Too Many Requests
Retry-After: 1
```

```json
{
  "error": {
    "code": "throttled",
    "message": "Rate limit exceeded",
    "details": {
      "retry_after": 1
    }
  }
}
```

The wait in seconds is in the `Retry-After` header and in `details.retry_after`. Back off like this:

1. Wait `Retry-After` seconds before the next call.
2. If you get `throttled` again, double the wait each time and cap it at a few seconds.
3. Space your calls so you stay under your `rate_limit` instead of relying on retries.

## Poll smart

The data behind the API does not change every second. USDT rates refresh at most every 60 seconds, BCV rates once a day and bank rates hourly. Polling any endpoint more than once per minute returns the same data and uses your quota for nothing.
**Tip:** Cache responses on your side and fetch each endpoint at most once per minute. For BCV rates, once an hour is plenty.