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

# Rate Limits

> Vintl API rate limits by plan, response headers, and how to handle 429 errors.

Each API key has a daily request quota. Limits reset at midnight UTC.

## Plans

| Plan         | Price    | Daily limit |
| ------------ | -------- | ----------- |
| Free         | \$0      | 500         |
| Indie        | \$49/mo  | 10,000      |
| Pro          | \$149/mo | 50,000      |
| Intelligence | \$349/mo | 200,000     |
| Team         | \$799/mo | 500,000     |

## Response headers

Every authenticated response includes rate limit headers:

```
RateLimit-Limit: 10000
RateLimit-Remaining: 9987
RateLimit-Reset: 1711235414
X-RateLimit-Tier: indie
```

| Header                | Description                                 |
| --------------------- | ------------------------------------------- |
| `RateLimit-Limit`     | Your daily quota                            |
| `RateLimit-Remaining` | Requests left today                         |
| `RateLimit-Reset`     | Unix timestamp when the quota resets        |
| `X-RateLimit-Tier`    | Your plan name                              |
| `Retry-After`         | Seconds until you can retry (only on `429`) |

Legacy `X-RateLimit-*` variants are included for backward compatibility.

## Handling 429

When you exceed your limit, the API returns `429 Too Many Requests` with a `Retry-After` header. Respect it — don't retry in a loop.

```python retry.py theme={"dark"}
import time
import requests

def fetch(url, headers, params=None, retries=3):
    for _ in range(retries):
        resp = requests.get(url, headers=headers, params=params)
        if resp.status_code != 429:
            return resp
        time.sleep(int(resp.headers.get("Retry-After", 60)))
    return resp
```

<Tip>
  Each paginated page counts as one request. Fetching 10,000 rows at `limit=1000` uses 10 requests, not 10,000.
</Tip>
