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

# Rate Limits

> Understand the rate limits applied to Notvis Connect API requests.

## Rate Limiting

Rate limiting is enforced at the infrastructure level to ensure fair usage and platform stability. The API itself does not enforce per-request rate limits — this is handled by the upstream proxy layer.

## Current Limits

| Plan       | Requests per second | Daily limit        |
| ---------- | ------------------- | ------------------ |
| Free       | 10 req/s            | 100 emails/day     |
| Starter    | 50 req/s            | 10,000 emails/day  |
| Growth     | 200 req/s           | 100,000 emails/day |
| Enterprise | Custom              | Custom             |

<Note>
  Rate limits are applied per API key. Contact us if you need higher limits.
</Note>

## Rate Limit Headers

When rate limiting is active, the following headers are included in responses:

| Header                  | Description                              |
| ----------------------- | ---------------------------------------- |
| `X-RateLimit-Limit`     | Maximum requests allowed in the window   |
| `X-RateLimit-Remaining` | Remaining requests in the current window |
| `X-RateLimit-Reset`     | Unix timestamp when the window resets    |

## Handling Rate Limits

If you exceed the rate limit, you'll receive a `429 Too Many Requests` response. Implement exponential backoff in your integration:

```javascript theme={null}
async function sendWithRetry(payload, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch('https://api.notvis.com/v1/emails/send', {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer nc_live_your_api_key',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(payload),
    });

    if (response.status !== 429) return response;

    const retryAfter = response.headers.get('Retry-After') || Math.pow(2, i);
    await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
  }
  throw new Error('Rate limit exceeded after retries');
}
```
