Перейти к содержимому
Transcript Dock
ВойтиНачать бесплатно

Меню сайта

Transcript Dock
ВведениеКак это работает, руководства и что можно расшифровать.
Быстрый стартОтправьте ссылку, дождитесь задачи, экспортируйте транскрипт. Три запроса.
АутентификацияAPI-ключи, области доступа, Idempotency-Key и X-Request-Id.
ЗадачиСоздание, ожидание, список, отмена и повтор задач.
ТранскриптыОбъект транскрипта и экспорт в txt, srt, vtt, json.
ПакетыДо 50 видео в одном запросе.
ЗагрузкиРасшифровывайте ваши собственные аудио- и видеофайлы.
ВебхукиПолучайте уведомление, когда задача или пакет завершится; проверяйте подпись.
ОшибкиВсе коды ошибок, что они значат и что делать.
Лимиты запросовОтправки, задачи в обработке и чтения по тарифу; ответ 429.
Тарифы и кредиты1 кредит за транскрипт по субтитрам, 2 за минуту AI-расшифровки. Тарифы и дополнительные кредиты.
ИсточникиYouTube, TikTok, ваши файлы и прямые ссылки: принимаемые URL и режимы.
MCPНаходите и расшифровывайте видео из Claude, Cursor, Windsurf или собственного агента.
Спецификация OpenAPIСпецификация OpenAPI 3.1 для генерации кода и типизированных клиентов.
Claude CodeОдна команда добавляет Transcript Dock в Claude Code.
Приложение ClaudeДобавьте Transcript Dock как пользовательский коннектор на claude.ai, в Claude Desktop или мобильном приложении.
CursorДобавьте Transcript Dock как MCP-сервер в Cursor.
WindsurfДобавьте Transcript Dock в Windsurf, чтобы Cascade мог находить видео и расшифровывать их.
OpenClawПодключите Transcript Dock к автономным агентам OpenClaw.
19 результатов
API

Справочник API

Эндпоинты, поля, ответы, кредиты, лимиты и ошибки.

Обновлено


Как это работает#

Каждый транскрипт создаётся как задача. Вы отправляете источник, задача выполняется в фоновом режиме, и после успешного завершения она указывает на транскрипт, который можно читать и экспортировать сколько угодно раз. Базовый URL: https://www.transcriptdock.com. Все запросы и ответы в формате JSON.

# 1. Submit
curl -X POST https://www.transcriptdock.com/v1/jobs \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: video-7680721699171601694" \
-H "Content-Type: application/json" \
-d '{ "source": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }, "mode": "captions_only" }'
 
# 2. Wait (returns as soon as the job finishes, up to 25 s per call)
curl "https://www.transcriptdock.com/v1/jobs/11111111-1111-4111-8111-111111111111?wait=25" \
-H "Authorization: Bearer td_live_YOUR_KEY"
 
# 3. Export
curl "https://www.transcriptdock.com/v1/transcripts/22222222-2222-4222-8222-222222222222/export?format=srt" \
-H "Authorization: Bearer td_live_YOUR_KEY"
Не вызывайте API из браузера: ваш ключ станет виден любому. Вызывайте API с вашего сервера и храните ключ в переменной окружения.

Аутентификация#

Создайте ключ на странице API-ключей. Ключ показывается один раз, выглядит как td_live_... и передаётся в заголовке Authorization в каждом запросе. Области доступа задаются при создании ключа: jobs:read, jobs:write, transcripts:read, uploads:write. Создавайте отдельный ключ для каждой интеграции, чтобы отозвать его по отдельности.

заголовок
Authorization: Bearer td_live_YOUR_KEY

Idempotency-Key#

Обязателен для POST /v1/jobs, /v1/batches, /v1/jobs/{id}/retry, /v1/video-discoveries и /v1/language-discoveries. Это любая строка длиной от 8 до 128 печатных символов ASCII. Повторный запрос с тем же ключом и тем же телом в течение 48 часов возвращает исходный объект, поэтому повторный запрос никогда не создаст задачу и не спишет кредиты дважды. Тот же ключ с другим телом возвращает 409 IDEMPOTENCY_CONFLICT. Удобно использовать в качестве ключа собственный идентификатор того, что вы транскрибируете.

X-Request-Id#

Каждый ответ содержит его. Укажите его, когда пишете в поддержку.

Эндпоинты#

МетодПутьЧто делаетКредиты
POST/v1/jobsТранскрибировать одно видео, файл или ссылку1 за транскрипт по субтитрам, 2 за минуту ИИ-транскрипции
GET/v1/jobs/{id}Статус задачи, ожидание до 25 сБесплатно
GET/v1/jobsИстория задачБесплатно
POST/v1/jobs/{id}/cancelОтменить задачу в очередиБесплатно
POST/v1/jobs/{id}/retryПовторить неудачную задачуКак новая задача
POST/v1/batchesТранскрибировать много видео (размер пакета зависит от тарифа)За каждый элемент, как выше
GET/v1/batches/{id}Статус пакетаБесплатно
GET/v1/transcripts/{id}Транскрипт в JSONБесплатно
GET/v1/transcripts/{id}/exportФайл txt, srt, vtt или jsonБесплатно
DELETE/v1/transcripts/{id}Удалить транскриптБесплатно
POST/v1/uploadsПолучить URL для загрузки файлаБесплатно
POST/v1/uploads/{id}/completeОтметить загрузку завершённойБесплатно
POST/v1/video-discoveriesПоиск на YouTube, список видео канала, плейлиста или профиля TikTok1 за страницу
GET/v1/video-discoveries/{id}Результат поиска видеоБесплатно
POST/v1/language-discoveriesСписок языков субтитров видео YouTube1
GET/v1/language-discoveries/{id}Список языковБесплатно
POST/v1/webhook-endpointsЗарегистрировать URL вебхука (нужен вход в аккаунт)Бесплатно
GET/v1/webhook-endpointsСписок URL вебхуковБесплатно
DELETE/v1/webhook-endpoints/{id}Отключить URL вебхука (нужен вход в аккаунт)Бесплатно
GET/v1/usageКредиты и тарифБесплатно
GET/v1/capabilitiesЧто может ваш ключБесплатно

Создание задачи#

POST/v1/jobs
source.urlstringНеобязательный
Публичное видео: YouTube (watch?v=, youtu.be, shorts, live) или TikTok (tiktok.com/@user/video/…, ссылки для общего доступа vm.tiktok.com). Любая другая ссылка https на аудио- или видеофайл обрабатывается как прямая ссылка на медиа (ИИ-транскрипция). Нужен один из параметров: url или upload_id.
source.upload_iduuidНеобязательный
Файл, который вы загрузили (см. раздел Загрузки). Всегда ИИ-транскрипция.
mode"captions_only" | "auto" | "transcribe"Обязательный
captions_only: собственные субтитры видео, 1 кредит. Если субтитров нет, возвращается ошибка NO_CAPTIONS. auto: субтитры, если они есть (1 кредит), иначе ИИ-транскрипция. transcribe: всегда ИИ-транскрипция аудио, 2 кредита за каждую начатую минуту, тайминги по словам. Для ИИ-транскрипции нужен платный тариф.
caption_languagesstring[]Необязательный
Предпочтительные языки субтитров по порядку, например ["en", "es"], не больше 5. По умолчанию: основная дорожка видео. Только для captions_only и auto.
caption_preference"prefer_creator" | "creator_only" | "automatic_only"Необязательный
Какие субтитры принимать: загруженные автором, автоматические субтитры YouTube или любые (по умолчанию prefer_creator: сначала субтитры автора).
languagestringНеобязательный
Подсказка языка речи для ИИ-транскрипции (BCP 47). По умолчанию: определяется автоматически.
max_creditsintegerНеобязательный
Лимит расходов на ИИ-транскрипцию. Медиафайл сначала измеряется. Если стоимость окажется выше, задача завершится ошибкой BUDGET_EXCEEDED, и кредиты не списываются. По умолчанию хватает на 2 часа.
webhook_endpoint_iduuidНеобязательный
Получать job.succeeded и job.failed на этот вебхук.
metadataobjectНеобязательный
До 10 строковых значений (ключи до 64 символов, значения до 256). Возвращаются в событиях вебхуков. На кэширование не влияют.

Возвращает 202 с задачей. Если в вашем рабочем пространстве уже есть транскрипт того же видео с теми же параметрами, возвращается 200 с успешно завершённой задачей, бесплатно (billing.kind: "cached").

Ответ 202
{
"id": "11111111-1111-4111-8111-111111111111",
"status": "queued",
"stage": "resolve",
"result_id": null,
"error": null,
"billing": { "credits_reserved": 2, "credits_charged": 0, "kind": "captions" },
"source": { "platform": "tiktok", "media_id": "7680721699171601694", "canonical_url": "https://www.tiktok.com/@tiktok/video/7680721699171601694", "title": null, "upload_id": null },
"options": { "mode": "auto", "language": null, "caption_preference": "prefer_creator" },
"created_at": "2026-09-16T10:00:00.000Z"
}

Объект задачи#

iduuidНеобязательный
Идентификатор задачи.
statusstringНеобязательный
queued → processing (→ awaiting_provider во время ИИ-транскрипции) → succeeded, failed или cancelled. Последние три статуса окончательные.
stagestring | nullНеобязательный
Этап выполнения задачи: resolve, captions, acquire_audio, submit_asr, wait_asr, finalize. Только для информации.
result_iduuid | nullНеобязательный
Транскрипт, после успешного завершения.
errorobject | nullНеобязательный
При ошибке: code, message, retryable, необязательное поле details.detail. Коды те же, что в разделе Ошибки.
billingobjectНеобязательный
credits_reserved (кредиты, зарезервированные на время выполнения, после завершения 0), credits_charged (итоговое списание), kind: captions, ai_transcription или cached.
sourceobjectНеобязательный
platform, media_id, canonical_url, title, upload_id.
optionsobjectНеобязательный
mode, language, caption_preference в принятом виде.
created_atdate-timeНеобязательный
UTC.

Получение задачи#

GET/v1/jobs/{id}?wait=25

Возвращает задачу. С параметром wait (от 0 до 25 секунд) запрос остаётся открытым и возвращает ответ, как только задача завершится окончательно, поэтому один вызов заменяет цикл опроса. Чтения имеют собственный лимит: 120 в минуту.

Список задач#

GET/v1/jobs?limit=20&cursor=

Сначала новые, limit от 1 до 100. Передайте next_cursor из ответа обратно как cursor, чтобы получить следующую страницу. Чтобы увидеть только задачи одного видео в любом режиме, укажите platform и source_id (source.media_id задачи) вместе. Так клиент проверяет, есть ли уже в рабочем пространстве транскрипт, прежде чем отправлять задачу снова.

Отмена задачи#

POST/v1/jobs/{id}/cancel

Отменяет задачу, которая ещё не начала ИИ-транскрипцию. Резерв кредитов снимается. Если ИИ-транскрипция уже началась, возвращается 409 CANCELLATION_NOT_ALLOWED, и задача доводится до конца.

Повтор задачи#

POST/v1/jobs/{id}/retry

Создаёт новую задачу на основе неудачной, у которой ошибка помечена как retryable. Нужен новый Idempotency-Key. Необязательное тело запроса: { "max_credits": 40 }. Оплата такая же, как у новой задачи. Окончательные ошибки (приватное видео, нет субтитров) возвращают 409 JOB_NOT_RETRYABLE: исправьте входные данные и отправьте задачу заново.

Транскрипт#

GET/v1/transcripts/{id}
iduuidНеобязательный
Совпадает с result_id задачи.
sourceobjectНеобязательный
platform, media_id, canonical_url, title.
source_originstringНеобязательный
creator_captions, platform_captions (субтитры, созданные платформой, например автоматические субтитры YouTube) или speech_recognition (ИИ-транскрипция).
languagestring | nullНеобязательный
Тег языка текста по BCP 47.
textstringНеобязательный
Весь транскрипт в виде простого текста.
segmentsarrayНеобязательный
Фрагменты размером с субтитры: { start, end, text } в секундах.
wordsarray | nullНеобязательный
{ start, end, text, confidence } для каждого слова. Только для ИИ-транскрипции.
timing_granularity"word" | "segment" | "none"Необязательный
Самая точная доступная разметка времени.
duration_secondsnumber | nullНеобязательный
Длительность медиафайла.
extraction_versionstringНеобязательный
Версия конвейера, который создал результат.
recognitionobject | nullНеобязательный
Только для ИИ-транскрипции: model, profile, quality_status (validated_language: язык проверен нами; provider_supported: модель заявляет поддержку языка; experimental_language: качество может отличаться).
created_atdate-timeНеобязательный
UTC.
Ответ 200
{
"id": "22222222-2222-4222-8222-222222222222",
"source": { "platform": "youtube", "media_id": "dQw4w9WgXcQ", "canonical_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "title": "Пример видео" },
"source_origin": "creator_captions",
"language": "ru",
"text": "Добро пожаловать на канал. Сегодня мы разберём субтитры.",
"segments": [
{ "start": 0, "end": 2.4, "text": "Добро пожаловать на канал" },
{ "start": 2.4, "end": 4.9, "text": "Сегодня мы разберём субтитры" }
],
"words": null,
"timing_granularity": "segment",
"duration_seconds": 212.0,
"recognition": null,
"extraction_version": "worker-0.1.0",
"created_at": "2026-09-16T10:00:14.000Z"
}

Транскрипты хранятся в течение срока хранения вашего тарифа: 7 дней на пробном тарифе, 30 дней на Starter, 90 дней на Pro и Scale. Чтобы удалить транскрипт раньше, используйте DELETE /v1/transcripts/{id}.

Экспорт транскрипта#

GET/v1/transcripts/{id}/export?format=srt
formatВы получаете
txtПростой текст, один сегмент на строку.
srtСубтитры SubRip.
vttСубтитры WebVTT.
jsonОбъект транскрипта выше.

Бесплатно, без ограничений. Для srt и vtt нужны тайминги. Если их нет, возвращается 422 TIMESTAMPS_UNAVAILABLE.

Пакеты#

POST/v1/batches

Один запрос, много видео. Каждый элемент содержит те же поля, что и Создание задачи. Пакет принимается или отклоняется целиком. Количество элементов в пакете: 1 на пробном тарифе, 10 на Starter, 25 на Pro, 50 на Scale.

itemsJobRequest[]Обязательный
От 1 до 50 запросов задач.
webhook_endpoint_iduuidНеобязательный
Получает одно событие batch.completed, когда все элементы завершены окончательно.
metadataobjectНеобязательный
Возвращается в событии batch.completed.
POST /v1/batches
curl -X POST https://www.transcriptdock.com/v1/batches \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: playlist-2026-09-16" \
-H "Content-Type: application/json" \
-d '{ "items": [
{ "source": { "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }, "mode": "captions_only" },
{ "source": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }, "mode": "captions_only" }
] }'

Объект пакета содержит status (queued, processing, succeeded, partial_success, failed, cancelled), счётчики (total_items, succeeded_items, failed_items, cancelled_items) и items, где у каждого элемента есть свой job_id. Читайте пакет через GET /v1/batches/{id}. Каждый элемент является обычной задачей.

Загрузки#

Ваши аудио- или видеофайлы (mp3, wav, m4a, ogg, aac, mp4, webm; до 250 МБ и 2 часов). Зарезервируйте место для файла, отправьте файл методом PUT на подписанный URL, отметьте загрузку как завершённую, затем создайте задачу с source.upload_id. Загрузки всегда обрабатываются через ИИ-транскрипцию.

загрузка и транскрипция
# 1. Reserve
curl -X POST https://www.transcriptdock.com/v1/uploads \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "filename": "interview.mp3", "content_type": "audio/mpeg", "bytes": 48213920 }'
# -> { "id": "33333333-...", "signed_upload_url": "https://...", "expires_at": "...", "status": "pending" }
 
# 2. Upload the bytes (same Content-Type you declared)
curl -X PUT "SIGNED_UPLOAD_URL" -H "Content-Type: audio/mpeg" --data-binary @interview.mp3
 
# 3. Complete
curl -X POST https://www.transcriptdock.com/v1/uploads/33333333-3333-4333-8333-333333333333/complete \
-H "Authorization: Bearer td_live_YOUR_KEY"
 
# 4. Transcribe it
curl -X POST https://www.transcriptdock.com/v1/jobs \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: interview-01" \
-H "Content-Type: application/json" \
-d '{ "source": { "upload_id": "33333333-3333-4333-8333-333333333333" }, "mode": "transcribe" }'
filenamestringОбязательный
До 255 символов.
content_typestringОбязательный
MIME-тип файла, например audio/mpeg или video/mp4. Передайте то же значение в PUT-запросе.
bytesintegerОбязательный
Точный размер файла. Размер в PUT-запросе должен совпадать.

Подписанный URL действителен 24 часа. После этого зарезервируйте новое место.

Вебхуки#

POST/v1/webhook-endpoints

Зарегистрируйте URL по https и передайте его id как webhook_endpoint_id при отправке задачи. Мы отправляем POST-запрос с событием, когда задача или пакет завершаются. Ответ один раз содержит секрет для подписи (secret). Регистрация и отключение эндпоинтов требуют входа в аккаунт, поэтому делайте это на странице «Вебхуки» в панели управления. API-ключ получит ответ 403 FORBIDDEN, но может просматривать список эндпоинтов.

urlstringОбязательный
URL по https, до 2048 символов.
descriptionstringНеобязательный
Название для вашего удобства.

События#

job.succeeded
{
"event_id": "44444444-4444-4444-8444-444444444444",
"type": "job.succeeded",
"created_at": "2026-09-16T10:00:14.000Z",
"job_id": "11111111-1111-4111-8111-111111111111",
"batch_id": null,
"result_id": "22222222-2222-4222-8222-222222222222",
"metadata": { "order": "8812" },
"error": null
}
  • job.succeeded: получите или экспортируйте result_id.
  • job.failed: в error содержится код.
  • batch.completed: все элементы завершены окончательно. Результаты по каждому элементу читайте в пакете.

Ответьте любым кодом 2xx в течение нескольких секунд. Неудачные доставки повторяются с нарастающими паузами, и их можно отправить повторно из панели управления. Событие может прийти больше одного раза, поэтому отсекайте дубликаты по event_id.

Проверка подписи#

Заголовки X-TranscriptDock-Event-Id, X-TranscriptDock-Timestamp и X-TranscriptDock-Signature. Подпись вычисляется как HMAC-SHA256 (hex) от строки {event_id}.{timestamp}.{raw_body} с вашим секретом. Отклоняйте всё, что старше пяти минут.

import crypto from "node:crypto";
 
export function verify(eventId: string, timestamp: string, rawBody: string, signature: string, secret: string): boolean {
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${eventId}.${timestamp}.${rawBody}`).digest("hex");
return expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}

Поиск видео#

POST/v1/video-discoveries

Ищите видео на YouTube или получайте список видео канала, плейлиста или профиля TikTok, затем передавайте ссылки в задачи. Поиск выполняется в фоновом режиме, как задача: читайте его через GET /v1/video-discoveries/{id}, пока status не станет succeeded. 1 кредит за страницу; результаты хранятся 24 часа.

kindstringОбязательный
youtube_search, youtube_channel_videos, youtube_channel_search, youtube_playlist_videos или tiktok_user_videos.
querystringНеобязательный
Текст поиска (youtube_search, youtube_channel_search).
channelstringНеобязательный
@никнейм, id канала или ссылка на канал (для видов с каналом).
playliststringНеобязательный
id или ссылка на плейлист (youtube_playlist_videos).
userstringНеобязательный
@пользователь или ссылка на профиль (tiktok_user_videos).
limitintegerНеобязательный
Видео на странице, от 1 до 50, по умолчанию 20. Для TikTok не больше 10.
cursorstringНеобязательный
next_cursor из предыдущей страницы. Только для YouTube.
include_detailsbooleanНеобязательный
Только для TikTok: также получать для каждого видео лайки, комментарии, хэштеги и языки субтитров.
поиск на YouTube
curl -X POST https://www.transcriptdock.com/v1/video-discoveries \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: search-async-rust-1" \
-H "Content-Type: application/json" \
-d '{ "kind": "youtube_search", "query": "async rust", "limit": 5 }'

POST-запрос отвечает 202 со статусом status: "queued". Готовый ответ GET /v1/video-discoveries/{id} выглядит так:

Ответ 200
{
"id": "55555555-5555-4555-8555-555555555555",
"kind": "youtube_search",
"status": "succeeded",
"request": { "kind": "youtube_search", "query": "async rust", "limit": 5 },
"videos": [
{
"platform": "youtube",
"video_id": "wXtngLBkK4Q",
"url": "https://www.youtube.com/watch?v=wXtngLBkK4Q",
"title": "Async Rust explained in 20 minutes",
"channel_id": "UCSp-OaMpsO8K0KkOqyBl7_w",
"channel_title": "Let's Get Rusty",
"duration_s": 1155,
"published_at": null,
"published_text": "5 months ago",
"view_count": 83635,
"view_count_text": "83,635 views",
"thumbnail_url": "https://i.ytimg.com/vi/wXtngLBkK4Q/hq720.jpg",
"tiktok": null
}
],
"profile": null,
"next_cursor": "opaque-token",
"error": null,
"created_at": "2026-09-16T12:00:00.000Z",
"updated_at": "2026-09-16T12:00:03.000Z",
"expires_at": "2026-09-17T12:00:00.000Z"
}

Языки субтитров видео#

POST/v1/language-discoveries

Тело запроса: { "source": { "url": "https://www.youtube.com/watch?v=..." } } с заголовком Idempotency-Key (только для YouTube, 1 кредит). Читайте GET /v1/language-discoveries/{id}, чтобы получить список дорожек субтитров с их кодами, признаком «автор» или «автоматические» и языком по умолчанию. Используйте коды в caption_languages.

Использование и возможности#

GET/v1/usage
Ответ 200
{
"plan": "pro",
"period_end": "2026-10-16T00:00:00.000Z",
"credits_remaining": 5840,
"credits_total": 6000,
"credits_reserved": 4,
"prepaid_credits": 0,
"transcribe_credits_per_minute": 2,
"minimum_billable_seconds": 60,
"subscription": {
"status": "active",
"interval": "yearly",
"cancel_at_period_end": false,
"current_period_end": "2027-09-16T00:00:00.000Z"
}
}

credits_remaining уже не учитывает credits_reserved (резервы для выполняющихся задач). prepaid_credits: купленные кредиты, которые не сгорают.

subscription содержит подписку Stripe, на которой основан платный тариф, а без тарифа равен null. В нём есть status, интервал оплаты interval (monthly или yearly), cancel_at_period_end и current_period_end: когда тариф продлится или закончится. period_end показывает, когда обновляются ежемесячные кредиты. На годовых тарифах это тоже происходит каждый месяц.

GET/v1/capabilities

Что ваш ключ может делать прямо сейчас: по каждому источнику (youtube, tiktok, instagram, upload, direct) доступные режимы, а также лимиты и цены. Не зашивайте эти значения в код, читайте их отсюда. Например, на пробном тарифе для auto и transcribe возвращается значение false.

Ответ 200
{
"youtube": { "enabled": true, "captions_only": true, "auto": true, "transcribe": true, "social_acquisition_fee": true },
"tiktok": { "enabled": true, "captions_only": true, "auto": true, "transcribe": true, "social_acquisition_fee": true },
"instagram": { "enabled": false, "captions_only": false, "auto": false, "transcribe": false, "social_acquisition_fee": true, "native_captions": "unverified_disabled" },
"upload": { "enabled": true, "captions_only": false, "auto": true, "transcribe": true, "social_acquisition_fee": false },
"direct": { "enabled": true, "captions_only": false, "auto": true, "transcribe": true, "social_acquisition_fee": false },
"max_duration_ms": 7200000,
"max_media_bytes": 262144000,
"export_formats": ["txt", "json", "srt", "vtt"],
"recognition_profiles": ["standard"],
"transcribe_credits_per_minute": 2,
"minimum_billable_seconds": 60,
"price_version": "2026-09-14",
"asr_enabled": true,
"instagram_enabled": false,
"free_caption_credits": 50,
"free_caption_credits_period": "month"
}

Лимиты запросов#

ТарифОтправки / минЗадач в работеЧтение / мин
Пробный1010120
Starter60100120
Pro120500120
Scale3002 000120

Если превышен лимит, вы получите 429 RATE_LIMITED с заголовком retry-after (в секундах) и details.detail, где назван лимит. Кредиты не списываются. Вебхуки и ?wait=25 помогают держаться далеко от лимита чтения.

Ошибки#

Все ошибки имеют одинаковый формат. retryable: true означает, что тот же запрос может пройти позже: подождите столько секунд, сколько указано в retry-after (если он есть), иначе сделайте паузу на несколько секунд, и используйте тот же Idempotency-Key, чтобы ничего не дублировалось. Любой другой ошибке нужно исправление с вашей стороны.

Ответ 402
{
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Not enough credits. Buy credits or upgrade your plan to continue.",
"retryable": false,
"details": { "detail": "This job needs more credits than you have left. Buy credits or upgrade your plan." },
"doc_url": "https://www.transcriptdock.com/docs/api-reference#error-codes"
},
"request_id": "66666666-6666-4666-8666-666666666666"
}

Задача, которая завершилась ошибкой после принятия, всё равно возвращает 200 на GET /v1/jobs/{id}, со статусом status: "failed" и тем же объектом ошибки в error. За неудачную задачу кредиты не списываются.

Коды#

КодHTTPПовторЗначение и что делать
INVALID_REQUEST422НетПоле отсутствует или имеет неверный формат. В details.detail указано, какое именно.
INVALID_URL422НетСсылка не является корректным URL по https (до 2048 символов).
UNSUPPORTED_SOURCE422НетСсылка не является URL видео YouTube или TikTok.
UNSAFE_URL422НетПрямая ссылка на медиа ведёт на закрытый или заблокированный сетевой адрес.
INVALID_CURSOR422НетКурсор поиска видео истёк или повреждён. Начните заново с первой страницы. Некорректный курсор списка задач возвращает INVALID_REQUEST.
CAPABILITY_UNAVAILABLE422НетЭтот режим недоступен для данного источника. Что доступно, показывает GET /v1/capabilities.
IDEMPOTENCY_CONFLICT409НетЭтот Idempotency-Key уже использовался с другим телом запроса. Используйте новый ключ.
UNAUTHENTICATED401НетВ заголовке Authorization нет действительного API-ключа или токена OAuth.
FORBIDDEN403НетУ ключа нет области доступа для этого эндпоинта, или рабочее пространство отключено.
EMAIL_UNVERIFIED403НетПодтвердите email аккаунта, прежде чем использовать API.
NOT_FOUND404НетТакого объекта нет в этом рабочем пространстве.
INSUFFICIENT_BALANCE402НетНедостаточно кредитов для этой задачи. Купите кредиты или перейдите на другой тариф.
PLAN_REQUIRED402НетНужен платный тариф (ИИ-транскрипция, большие пакеты) или пробные кредиты закончились.
BUDGET_EXCEEDED402НетИзмеренная стоимость выше max_credits. Кредиты не списаны. Повысьте лимит или пропустите медиафайл.
JOB_NOT_RETRYABLE409НетОшибка окончательная (приватное видео, нет субтитров). Исправьте входные данные и отправьте новую задачу.
CANCELLATION_NOT_ALLOWED409НетИИ-транскрипция уже началась, задача будет завершена.
RATE_LIMITED429ДаПревышен лимит запросов или очереди. Подождите столько секунд, сколько указано в retry-after. В details.detail написано, какой лимит превышен.
SOURCE_NOT_FOUND422НетВидео не существует или было удалено.
SOURCE_PRIVATE422НетВидео приватное. Работают только публичные видео.
SOURCE_AUTH_REQUIRED422НетДля видео нужен вход в аккаунт, подтверждение возраста или членство в канале.
SOURCE_REGION_RESTRICTED422НетВидео заблокировано в регионах, из которых мы его получаем.
NO_CAPTIONS422НетУ видео нет субтитров, а режим был captions_only. Используйте auto или transcribe.
LANGUAGE_UNAVAILABLE422НетНи один язык из caption_languages не найден у этого видео. Уберите список, чтобы взять дорожку по умолчанию.
LANGUAGE_UNSUPPORTED422НетИИ-транскрипция не поддерживает запрошенный язык.
NO_SPEECH422НетИИ-транскрипция не нашла речи в аудио.
NO_AUDIO422НетВ медиафайле нет аудиодорожки.
INVALID_MEDIA422НетНе удалось прочитать файл как аудио или видео.
UNSUPPORTED_MEDIA422НетЭто не аудио- или видеофайл.
DURATION_LIMIT_EXCEEDED413НетДлиннее 2 часов.
FILE_TOO_LARGE413НетБольше 250 МБ.
TIMESTAMPS_UNAVAILABLE422НетУ этого транскрипта нет таймингов, поэтому экспорт в srt и vtt недоступен. Используйте txt или json.
PROVIDER_REJECTED422НетМодель ИИ-транскрипции не смогла обработать это аудио.
SOURCE_RATE_LIMITED503ДаПлатформа-источник ограничивает наши запросы. Задача повторится автоматически.
SOURCE_BLOCKED503ДаПлатформа-источник заблокировала получение данных. Задача повторится автоматически.
SOURCE_TIMEOUT503ДаПлатформа-источник не ответила вовремя. Задача повторится автоматически.
SOURCE_CHANGED503ДаИсточник изменился, пока мы его читали. Задача повторится автоматически.
PROVIDER_UNAVAILABLE503ДаИИ-транскрипция временно недоступна. Задача повторится автоматически.
STORAGE_UNAVAILABLE503ДаХранилище файлов временно недоступно. Повторите запрос.
INTERNAL_ERROR500ДаОшибка на нашей стороне. Повторите запрос с тем же Idempotency-Key. Если ошибка повторяется, укажите X-Request-Id.