ДокументацияОшибки
Ошибки
Разберитесь в кодах ошибок API и транскрибации. Узнайте, когда исправить запрос, а когда повторить попытку.
Сначала определите, где произошла ошибка. Если API не принял запрос, вы получите HTTP-ошибку. Если запрос прошёл, но расшифровать запись не удалось, у созданной задачи будет status=failed.
Формат ошибки
Для всех ошибок запросов к /v1 API использует один формат:
{
"error": {
"code": "insufficient_minutes",
"message": "Not enough minutes",
"retryable": false,
"action_url": "https://transcript1.com/dashboard/billing",
"minutes_needed": 20,
"minutes_remaining": 3
}
}Логику обработки привязывайте к code, а message показывайте пользователю. На текст сообщения полагаться нельзя: мы можем его изменить. Значение retryable=true означает, что повторный запрос позже может пройти.
В зависимости от ошибки рядом с retryable могут быть дополнительные поля:
| Поле | Код ошибки | Что содержит |
|---|---|---|
action_url | insufficient_minutes, no_active_plan, topup_needs_user | Ссылку для подключения тарифа или покупки минут. |
minutes_needed, minutes_remaining | insufficient_minutes | Сколько минут требуется и сколько осталось. Если длительность ещё неизвестна, в первом поле будет null. |
reason, packs | topup_needs_user | Почему оплата с карты не списана и сколько пакетов было запрошено. |
supported_platforms | unsupported_platform | Список допустимых платформ: ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"]. |
missing_chunks | upload_incomplete | Индексы недостающих частей файла. |
max_bytes | media_too_large | Ваш лимит размера файла в байтах. |
params | invalid_request | Ошибки в полях тела запроса или query-параметрах. Ключ объекта — имя поля, значение — описание проблемы. |
Ошибки запроса
| HTTP-код | code | Повторить без изменений? | Причина и действие |
|---|---|---|---|
| 400, 422 | invalid_request | Нет | Не хватает параметра или поля, либо значение недопустимо. Например, нельзя сочетать diarize с source: "captions", а reuse_recent — с webhook_url. Невалидный JSON даёт тот же код. |
| 422 | invalid_url | Нет | Проверьте ссылку и её соответствие platform. Подойдут YouTube, X, TikTok, Instagram, Facebook, Bluesky и другие платформы из раздела «Источники и параметры». |
| 422 | unsupported_platform | Нет | API не поддерживает указанное значение platform. |
| 422 | unsupported_media | Нет | Расширение загруженного файла не входит в список поддерживаемых. |
| 401 | unauthorized | Нет | Ключ или токен не передан, неверен, истёк или отозван. Для загрузки — токен неверен или истёк. |
| 403 | insufficient_scope | Нет | В OAuth-токене нет нужного разрешения: transcriptions:read или transcriptions:write. |
| 403 | email_not_verified | Нет | Для создания задач и live-сессий сначала подтвердите почту. |
| 402 | insufficient_minutes | Нет | На балансе 0 минут или их не хватает на запись либо меньше одной начатой минуты live-сессии. Если включено автопополнение, transcript1 сначала пробует пополнить баланс. Купите минуты по ссылке из action_url или поручите это ИИ-агенту через POST /v1/topups или MCP-инструмент top_up. |
| 402 | no_active_plan | Нет | Для покупки дополнительных минут нужен активный платный тариф. Ошибку возвращают POST /v1/topups и платёжные эндпоинты личного кабинета, но не эндпоинты транскрибации. |
| 402 | topup_needs_user | Только для pending и in_progress | POST /v1/topups не списал оплату с карты. Причина — в reason: not_allowed (учётным данным нельзя покупать пополнения или их владелец не администратор команды), cap_reached (в месячном лимите для ИИ-агентов не осталось запаса), card_declined, authentication_required или no_card. Пользователь может купить пакеты по ссылке из action_url. При pending (платёж ещё не подтверждён) и in_progress (идёт другое пополнение) платёж ещё может пройти: повторите попытку позже с тем же Idempotency-Key, а не отправляйте пользователя покупать. |
| 404 | not_found | Нет | Задача не найдена или принадлежит другой команде. |
| 409 | upload_incomplete | Нет | Загрузите недостающие части файла и снова вызовите завершение загрузки. |
| 409 | invalid_state | Нет | Задача больше не ждёт загрузки. Отправлять части или завершать её уже нельзя. |
| 409 | session_ended | Нет | Live-сессия завершена, поэтому POST /v1/live/sessions/:id/token не может выдать токен. Также приходит как событие error в WebSocket. |
| 422 | unsupported_language | Нет | Значение language live-сессии не поддерживается. |
| 422 | unsupported_translation | Нет | Язык translate_to live-сессии не поддерживается, либо live-перевод недоступен. |
| 409 | idempotency_conflict | Нет | Этот Idempotency-Key ранее передали с другим набором параметров. |
| 413 | media_too_large | Нет | Размер файла превышает ваш лимит — см. «Загрузка файлов». |
| 413 | invalid_request | Нет | Тело JSON превышает 1 МБ. Для слишком большого файла используется другой код: media_too_large. |
| 429 | rate_limited | Да | Исчерпан лимит запросов в минуту. Число секунд до повтора указано в Retry-After. |
| 429 | too_many_active_jobs | Да | Достигнут лимит выполняющихся задач или открытых загрузок. Подождите столько секунд, сколько указано в Retry-After. |
| 429 | too_many_live_sessions | Да | Заняты все одновременные live-сессии вашего тарифа. Подождите столько секунд, сколько указано в Retry-After (30). |
| 500 | internal_error | Да | Ошибка на стороне transcript1. Попробуйте ещё раз чуть позже. |
| 503 | service_unavailable | Да | Сервис временно недоступен. Попробуйте ещё раз чуть позже. |
| 503 | live_capacity | Да | Вся ёмкость live занята. Подождите столько секунд, сколько указано в Retry-After (30), и создайте сессию снова. |
| 503 | live_unavailable | Нет | Расшифровка в реальном времени сейчас недоступна. |
Для браузерных запросов с cookie входа вместо Bearer-аутентификации проверяем также источник запроса. Вызов с другого сайта вернёт 403 forbidden_origin. К API-запросам с заголовком Authorization эта проверка не относится.
В любом ответе 429 есть Retry-After — время ожидания в секундах. Значения лимитов приведены в разделе «Тарифы и лимиты».
Когда повторять запрос
- Автоматически повторяйте запрос только при
retryable=true. Это ошибкиrate_limited,too_many_active_jobs,too_many_live_sessions,live_capacity,internal_error,service_unavailable, а такжеtopup_needs_userсreasonpendingилиin_progress. Выдержите паузу изRetry-After, а если заголовка нет, увеличивайте интервал между попытками. - Для повторного
POST /v1/transcriptionsилиPOST /v1/topupsсохраняйте прежнийIdempotency-Key. Если первый запрос успел пройти, новая попытка не приведёт к повторному списанию. - Остальные ошибки требуют исправления запроса. Отправлять его без изменений не стоит.
Расшифровка в реальном времени
POST /v1/live/sessions и остальные эндпоинты live используют тот же формат ошибки. К ним применимы также invalid_request, unsupported_language, insufficient_minutes и email_not_verified, а вместе с ними — live-коды из таблицы выше. Создание сессии не идемпотентно, поэтому повтор после too_many_live_sessions или live_capacity создаст новую сессию.
После создания сессии проблемы приходят по WebSocket как события error и коды закрытия, а не как HTTP-ошибки. Все события описаны в разделе «Расшифровка в реальном времени».
| Код закрытия | Значение |
|---|---|
1000 | Обычное закрытие после session.ended. |
1011 | Неожиданная ошибка сервера. Возобновите сессию с новым токеном. |
1012 | Перезапуск сервера, после reconnect. Возобновите сессию с новым токеном. |
4001 | Токен неверен, истёк или уже использован. |
4004 | Сессия не найдена или уже завершена. |
4008 | Нарушение протокола: звуковой кадр нечётной длины или слишком большого размера. |
4010 | Заменено более новым подключением к той же сессии. |
Live-сессия, которая завершилась по причине вроде balance_exhausted или idle_timeout, ошибкой не считается: она отправляет session.ended с причиной завершения и сохраняется. См. «Причины завершения».
Если транскрибация завершилась с ошибкой
Задача со status=failed содержит error: { "code", "message" }. HTTP-запрос к этому моменту мог давно завершиться успешно. Поэтому проверяйте error, когда запрашиваете статус или получаете вебхук transcription.failed. Если перевод не удался, отправляется вебхук transcription.translation.failed, а сама транскрипция из-за этого никогда не завершается ошибкой.
error.code | Что случилось | Что делать |
|---|---|---|
media_unavailable | Видео удалено, не существует или недоступно. | Проверьте URL. Повтор без изменений не поможет. |
media_private | Доступ к видео закрыт. | Нужен публичный пост. Для YouTube подойдёт также видео с доступом по ссылке. |
login_required | Для просмотра нужен вход в аккаунт. | Не повторяйте: это постоянная ошибка, автоматических повторов нет. |
no_audio | У видео нет звуковой дорожки. | Не повторяйте: это постоянная ошибка, автоматических повторов нет. |
age_restricted | Просмотр ограничен по возрасту. | Вместо повторного запроса загрузите файл. |
live_stream | Трансляция ещё идёт или не началась. | Попробуйте после её завершения. |
no_captions | В режиме captions не нашлось подходящей дорожки субтитров. | Смените source на "auto" или "stt". |
media_too_long | Запись длиннее 5 часов — лимита распознавания речи. | Разделите запись. Повтор целиком не поможет. |
unsupported_media | Не удалось прочитать файл или в нём нет аудиодорожки. | Отправьте файл в поддерживаемом формате. |
no_speech | Речь не обнаружена. | Не повторяйте. |
unsupported_language | Язык записи не поддерживается. | Укажите в language поддерживаемый код или "auto". Без изменений не повторяйте. |
insufficient_minutes | К моменту списания на балансе не хватило минут, а автопополнение, если оно включено, не смогло их добавить. | Пополните баланс и попробуйте снова. |
fetch_failed | Несколько попыток скачать запись не удались. | Попробуйте ещё раз позже. |
transcription_failed | Распознать речь не удалось даже после повторных попыток. | Попробуйте ещё раз позже. |
Если транскрибация завершилась с ошибкой или вы её отменили, платить не нужно. Уже списанные минуты вернём на баланс.
Дата обновления 5 ноября 2026 г.