> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.voicebip.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.voicebip.com/_mcp/server.

# Rate Limits

> Per-workspace rate limits by tier and how to handle 429 responses.

Voicebip enforces per-workspace rate limits using a Redis sliding window. Limits vary by tier.

## Limits by Tier

| Tier           | Requests / Minute | Concurrent Calls |
| -------------- | ----------------- | ---------------- |
| Starter (free) | 1,000             | 10               |
| Builder        | 5,000             | 100              |
| Scale          | 20,000            | 500              |

## 429 Response

When your rate limit is exceeded, the API returns HTTP 429 with a `Retry-After` header:

```json
{
  "error_code": "RATE_LIMITED",
  "message": "Rate limit exceeded. Retry after 12 seconds.",
  "request_id": "req_xxxxxxxxxxxx",
  "documentation_url": "https://docs.voicebip.com/errors/RATE_LIMITED"
}
```

The `Retry-After` header contains the number of seconds to wait before retrying.

## How It Works

Rate limits are tracked per workspace (not per API key). The sliding window resets every minute. All API endpoints count toward the same limit.

## Handling Rate Limits

```python
import time
import requests

def api_call_with_retry(url, headers, max_retries=3):
    for attempt in range(max_retries):
        resp = requests.get(url, headers=headers)
        if resp.status_code == 429:
            wait = int(resp.headers.get('Retry-After', 5))
            time.sleep(wait)
            continue
        return resp
    raise Exception("Rate limit exceeded after retries")
```