Voice Integration
Rate Limits
Rate limits and session limits specific to voice integration.
The two voice endpoints have their own fixed, per-API-key rate limits — independent of the general Public API rate limits.
Limits
| Limit | Value |
|---|---|
GET /voice-agents | 100 requests/minute |
POST /voice-agents/:agentId/sessions | 10 requests/minute |
| Concurrent sessions per key | 5 |
| Maximum session duration | 3600 seconds (1 hour) |
A session still running at the 3600-second mark is closed automatically; session_state is set to completed with a timeout reason.
X-RateLimit-* headers
Every response from either endpoint carries these headers:
| Header | Description | Example |
|---|---|---|
X-RateLimit-Limit | The endpoint's limit, requests/minute | 100 |
X-RateLimit-Remaining | Requests left in the current 60-second window | 37 |
X-RateLimit-Reset | Unix timestamp (seconds) when the current window ends | 1732550460 |
X-RateLimit-Retry-After | Seconds until the window resets — only present on 429 responses | 23 |
A 429 also carries a plain Retry-After header with the same value as X-RateLimit-Retry-After.
Rate Limit Best Practices
- Cache the discovery response. Your list of voice-enabled agents rarely changes — call
GET /voice-agentsonce and cache the result instead of calling it before every session. - Use exponential backoff on
429. Readretry_afterfrom the response body (orRetry-Afterheader) and back off at least that long; add jitter if you're retrying multiple sessions at once. - Monitor
X-RateLimit-Remaining. Slow down proactively when it gets low instead of waiting for a429. - Reuse sessions where possible. Each session start counts against both the 10 req/min limit and the 5-concurrent-session cap — end sessions promptly (see Session Management) so the slot is free for the next call.