Rate limits
Limits keep the early-access service fair and stable for everyone. They are set per workspace and apply across all of that workspace's API keys.
Plans and limits are indicative and subject to change at general availability. See pricing for current plan prices.
Limits by plan
| Limit | Free sandbox | Builder | Business | Enterprise |
|---|---|---|---|---|
| Price | $0 | $29/mo ($22 yearly) | $249/mo ($199 yearly) | Custom |
| Included audio | 10 min/month | Plan allowance | Plan allowance | Custom |
| REST requests per minute | 20 | 120 | 600 | Custom |
| Concurrent streams / calls | 1 | 5 | 25 | Custom |
| TTS characters per request | 1,000 | 5,000 | 5,000 | 5,000 |
| STT file length | 10 min | 1 hour | 2 hours | 2 hours |
| Voice cloning | no | 3 voices | 20 voices | Custom |
| Dubbing (preview) | no | no | on request | yes |
| Agents | sandbox | sandbox | sandbox + pilot numbers | yes |
Sandbox keys (wrd_test_) always use the Free sandbox limits, whatever your plan.
Rate limit headers
Every REST response includes:
| Header | Meaning |
|---|---|
X-RateLimit-Limit |
Requests allowed in the current one-minute window |
X-RateLimit-Remaining |
Requests left in the window |
X-RateLimit-Reset |
Seconds until the window resets |
When you hit a limit
Requests over the limit return 429 with code rate_limited and a Retry-After header in seconds. Too many open streams close with WebSocket code 4029. Using up your monthly audio returns 429 with code quota_exceeded.
Retry with exponential backoff and a little jitter. The SDKs do this for you, up to 3 times.
from waridi import Waridi
client = Waridi(max_retries=5) # default is 3
import { Waridi } from "@waridi/sdk";
const client = new Waridi({ maxRetries: 5 }); // default is 3
# cURL does not retry 429s by default. Respect Retry-After:
curl --retry 5 --retry-all-errors https://api.waridi.io/v1/tts ...
Need more?
If you are planning a launch, a large backfill or a busy phone line, write to hello@waridi.io a week ahead and we will raise your limits for the pilot.