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

# Vobiz API Rate Limits – Quotas, 429 Errors & Retry-After

> How Vobiz API rate limits work: per-account request quotas, the error budget on Make Call, per-IP limits on signup and OTP, the 429 response format, and how to retry safely with Retry-After and exponential backoff.

Vobiz rate-limits API requests to keep the platform fast and fair for every account. This page explains which limits apply, what a rate-limited response looks like, and how to retry safely.

> [!NOTE]
>
> API rate limits are separate from call capacity. **CPS** (calls per second) and **concurrency** (simultaneous active calls) limit how many calls you can run. See [Why am I getting a 429 error?](/docs/faq/error-429) for those limits.

## Limits at a glance

| Limit | Applies to | Scope | Response when exceeded |
| - | - | - | - |
| Request quota | Voice API requests (`/api/v1/Account/{auth_id}/...`) | Your parent account, shared with all its sub-accounts | `429` |
| Error budget | Make Call and Add Participant requests | Your parent account | `429` |
| Per-IP limit | Signup, OTP and contact-form endpoints | Client IP address, one-hour window | `429` with `Retry-After` |
| CPS and concurrency | Placing calls | Your account's provisioned capacity | `429` (see [FAQ](/docs/faq/error-429)) |

## Voice API request quota

Each parent account gets a request quota for a time window. Sub-accounts share their parent's quota.

* **Make Call and Add Participant are not counted** against this quota. CPS, concurrency and the error budget below govern those requests instead.
* **The window restarts after each accepted request.** If you keep sending requests at the limit, you stay limited. Pause for the full window to clear the counter.
* **Need more?** Accounts with higher call capacity get a larger quota automatically. Contact [support](mailto:support@vobiz.ai) for a custom quota.

When you exceed the quota, the API returns `429 Too Many Requests`:

```json 429 response theme={null}
{
  "api_id": "c1a8d2e4-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
  "error": "you've been rate limited. please try after sometime"
}
```

## Error budget on Make Call

If too many Make Call or Add Participant requests fail with a `4xx` or `5xx` error, Vobiz briefly blocks further requests of that type. This stops a misconfigured dialer from looping on failing calls.

```json 429 response theme={null}
{
  "api_id": "c1a8d2e4-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
  "error": "You have been rate limited due to too many 4XX or 5XX errors. Please try again later or contact support."
}
```

To avoid it, fix the cause of failing requests before you retry. Don't retry a `4xx` response in a loop: it won't succeed and it uses up your error budget.

## Signup, OTP and contact endpoints

Account signup, OTP requests and the contact form are limited per client IP over a one-hour window. When you exceed the limit, the response includes a `Retry-After` header with the number of seconds to wait:

```http 429 response theme={null}
HTTP/1.1 429 Too Many Requests
Retry-After: 3412
Content-Type: application/json
```

## How to handle a 429

1. **Honor `Retry-After` when it is present.** Wait at least that many seconds before you retry.
2. **Otherwise, back off exponentially with jitter.** Wait 1s, then 2s, 4s and so on, up to about 60s, with a random offset so parallel workers don't retry together.
3. **Pace requests on your side.** Use a queue or token bucket so your steady-state rate stays below your quota, instead of relying on 429s to slow you down.
4. **Log the `api_id`.** Include it when you contact support.

```python Retry with backoff theme={null}
import random
import time

import requests


def request_with_retry(method, url, max_attempts=6, **kwargs):
    for attempt in range(max_attempts):
        response = requests.request(method, url, **kwargs)
        if response.status_code != 429:
            return response
        retry_after = response.headers.get("Retry-After")
        if retry_after is not None:
            delay = int(retry_after)
        else:
            delay = min(2 ** attempt, 60) + random.uniform(0, 1)
        time.sleep(delay)
    return response
```

## Related

* [Error handling](/docs/errors) - error format and HTTP status codes
* [Why am I getting a 429 error?](/docs/faq/error-429) - CPS and concurrency limits
* [Best practices](/docs/best-practices) - building reliable integrations


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.