Appearance
Ошибки и лимиты
Формат ошибок
Все ошибки возвращают JSON с полем detail:
json
{
"detail": "Описание ошибки"
}HTTP-коды ответов
| Код | Значение | Когда возникает |
|---|---|---|
400 | Bad Request | Некорректный запрос: текст слишком длинный, не указан голос, неверный формат |
401 | Unauthorized | Отсутствует, невалидный, истёкший или отозванный API-ключ |
402 | Payment Required | Недостаточный баланс для синтеза |
403 | Forbidden | Модель недоступна на вашем тарифе |
408 | Request Timeout | Синтез занял более 5 минут |
429 | Too Many Requests | Превышен лимит запросов или параллельных подключений |
500 | Internal Server Error | Внутренняя ошибка сервера |
502 | Bad Gateway | TTS-воркер не смог обработать запрос |
Лимиты запросов
Лимиты применяются на пользователя (не на API-ключ). Контролируются два типа ограничений:
Запросы в минуту (RPM)
Максимальное количество TTS-запросов в скользящем окне длительностью 1 минута.
Параллельные запросы
Максимальное количество TTS-запросов, обрабатываемых одновременно.
| Тариф | RPM | Параллельных |
|---|---|---|
| Free | 5 | 1 |
| Basic | 10 | 2 |
| Pro | 30 | 5 |
Обработка ошибки 429
При превышении лимита ответ выглядит так:
json
{
"detail": "Rate limit exceeded (5/5 requests per minute)"
}Рекомендуемая стратегия — экспоненциальная задержка с базовым интервалом 1 секунда.
python
import time
import requests
def synthesize_with_retry(url, headers, payload, max_retries=3):
for attempt in range(max_retries):
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 429:
delay = 2 ** attempt
time.sleep(delay)
continue
return response
raise Exception("Превышено количество попыток")