> For the complete documentation index, see [llms.txt](https://docs.elevateab.com/elevate-helpcenter/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.elevateab.com/elevate-helpcenter/developer-reference/external-api/rate-limits.md).

# Rate limits

How Elevate A/B Testing External API rate limits work: per-store points, the cost of each endpoint, the rate limit headers, and 429 retries.

Each store has a bucket of **100 points** that refills at **100 points per minute**, shared by every integration using the store's key. Each request spends points depending on how much work it takes:

| Cost | Endpoints                                                        |
| ---- | ---------------------------------------------------------------- |
| 1    | `/me`, `/custom-events`, `/experiments`, `/experiments/{testId}` |
| 5    | `/summary`, `/filter-values`                                     |
| 10   | `/results`, `/timeseries`, `/segments/{view}`, `/store/overview` |

A full bucket covers 10 `/results` calls in a row, then one more every 6 seconds.

## Headers

Every response tells you where you stand:

| Header                  | Meaning                                     |
| ----------------------- | ------------------------------------------- |
| `x-ratelimit-limit`     | Bucket size                                 |
| `x-ratelimit-remaining` | Points left after this request              |
| `x-ratelimit-cost`      | Points this request cost                    |
| `x-ratelimit-reset`     | Unix time (seconds) when the bucket is full |

Rely on the headers rather than the numbers on this page, which can change.

## When you hit the limit

The request is rejected with `429` and nothing is charged:

```json
{
  "success": false,
  "error": "Rate limit exceeded: this request costs 10 points and 4 of 100 are available",
  "code": "TOO_MANY_REQUESTS",
  "retryAfter": 4
}
```

Wait `retryAfter` seconds (also in the `retry-after` header), then retry.

{% hint style="info" %}
**Spend fewer points:** use `/summary` when you only need headline metrics and the status, find experiments with `/experiments?status=running` first, and poll no more often than your reports need. Results don't change second by second.
{% endhint %}
