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

# Rate limits

# API rate limits and evaluation usage

> EvalGate bills completed evaluation results. API rate limits are separate operational safeguards and do not change the price.

## Pay-as-you-go evaluation usage

EvalGate has one hosted plan:

| Usage                                      | Price         |
| ------------------------------------------ | ------------- |
| First 10,000 evaluation results each month | Free          |
| Additional evaluation results              | \$1 per 1,000 |
| Users, projects, datasets, and runs        | Unlimited     |
| Default monthly overage cap                | \$50          |

Model inference is bring-your-own-key (BYOK). Your model provider bills its own
tokens and requests directly; EvalGate does not add an inference markup.

### What counts as one result

One result is one persisted test-case outcome from an evaluation run.

* A passed case counts once.
* An evaluated failure counts once.
* Multiple scorers on the same case do not multiply usage.
* A retry of the same evaluation run reuses the run billing key and does not
  create a second usage event.
* An empty run, a human-review placeholder, or an infrastructure failure before
  a result is persisted counts as zero.

<Note>
  A payment method is only required to continue beyond the 10,000-result free
  allowance. The default cap allows up to 50,000 paid results (\$50) in a month.
</Note>

## API rate limits

Rate limits protect the service from runaway request loops. They are independent
of monthly evaluation-result billing.

| Request context            | Rate limit           |
| -------------------------- | -------------------- |
| Anonymous utility requests | 100 requests/hour    |
| Signed-in member sessions  | 5,000 requests/day   |
| Owner and admin sessions   | 50,000 requests/day  |
| API keys and MCP tools     | 100,000 requests/day |

Authenticated requests are keyed by organization and user, or by API key when
available. EvalGate uses Upstash Redis in production and an in-memory fallback
in local development unless fail-closed mode is explicitly enabled.

## Rate limit response headers

Every limited response includes:

| Header                  | Description                             |
| ----------------------- | --------------------------------------- |
| `X-RateLimit-Limit`     | Maximum requests in the active window   |
| `X-RateLimit-Remaining` | Requests remaining in the active window |
| `X-RateLimit-Reset`     | Unix timestamp when the window resets   |

When a request exceeds its limit, the API returns HTTP `429`:

```json theme={null}
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Too many requests. Retry after the window resets.",
    "requestId": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

Use exponential backoff and respect `Retry-After` or
`X-RateLimit-Reset` before retrying.

```typescript theme={null}
async function requestWithBackoff(
  fn: () => Promise<Response>,
  maxRetries = 5,
) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fn();
    if (response.status !== 429) return response;
    await new Promise((resolve) =>
      setTimeout(resolve, Math.pow(2, attempt) * 100),
    );
  }
  throw new Error("Rate limit retries exhausted");
}
```

View current evaluation-result usage or add a payment method from
**Settings → Billing**.
