convr Войти

REST · JSON · Webhooks

API для разработчиков

Всё, что умеет сайт, — из вашего кода: конвертация, сжатие, нарезка, распознавание речи, импорт по ссылке. JSON по HTTPS, ключ в заголовке, вебхук по готовности.

Получить ключ → Базовый адресhttps://convr.app/api/v1

Обзор

Базовый адрес — https://convr.app/api/v1. Запросы и ответы — JSON в UTF-8, у запросов с телом нужен заголовок Content-Type: application/json. Время — RFC 3339 в UTC, размеры — в байтах, длительности — в секундах.

Обычный сценарий:

  • создать задание (POST /jobs) — с именем и размером файла или со ссылкой;
  • загрузить файл напрямую в хранилище по выданной ссылке и сообщить POST /jobs/{id}/uploaded;
  • дождаться state: "done" — вебхуком или опросом GET /jobs/{id};
  • получить ссылку на результат: GET /jobs/{id}/download.

Файлы не проходят через API-сервер: загрузка и скачивание идут напрямую в хранилище и CDN, поэтому размер файла ограничен только тарифом.

Быстрый старт

export CONVR_KEY=cvk_…

# 1. create a job: what into what, and the file's name and size
curl -s -X POST https://convr.app/api/v1/jobs -H "Authorization: Bearer $CONVR_KEY" -H "Content-Type: application/json" \
  -d '{"converter":"mov-mp4","options":{"quality":"medium"},
       "file":{"name":"clip.mov","size":52428800}}'
# → {"batch_id":"…","job":{"id":"JOB","state":"awaiting_input",…},
#    "upload":{"put_url":"PUT_URL","headers":{"Content-Type":"video/quicktime"}}}

# 2. upload the file straight to storage (no API key here)
curl -X PUT "PUT_URL" -H "Content-Type: video/quicktime" --data-binary @clip.mov

# 3. start it
curl -s -X POST https://convr.app/api/v1/jobs/JOB/uploaded -H "Authorization: Bearer $CONVR_KEY"

# 4. poll until "state":"done", then take the result
curl -s https://convr.app/api/v1/jobs/JOB -H "Authorization: Bearer $CONVR_KEY"
curl -s https://convr.app/api/v1/jobs/JOB/download -H "Authorization: Bearer $CONVR_KEY"
# → {"url":"https://…","expires_at":"…"}

Ключ и доступ

Создайте ключ в личном кабинете и передавайте его в каждом запросе:

Authorization: Bearer cvk_…

  • ключ действует от имени аккаунта: те же лимиты тарифа, та же история файлов;
  • работает только на тарифах с API; если тариф закончился — 403 plan_required;
  • ключ показывается один раз, у нас хранится только его хеш; потеряли — отзовите и создайте новый;
  • до 10 ключей на аккаунт, отзыв действует мгновенно;
  • ключом нельзя управлять аккаунтом: вход, пароль, оплата, сами ключи — 403 not_for_keys.

Никогда не вставляйте ключ в код страницы или мобильного приложения: его оттуда достанут. Вызывайте API со своего сервера.

Лимиты

  • Частота: 120 запросов в минуту на ключ (с запасом на короткие всплески). Сверх — 429 rate_limited и заголовок Retry-After в секундах.
  • Тариф: размер файла, задания в сутки, одновременные задания, длительность видео, минуты распознавания речи и срок хранения результатов — как у вашего тарифа. Точные числа отдаёт GET /limits.
  • Ссылки на загрузку живут 15 минут, ссылки на результат — 30 минут; новую ссылку на результат можно получить в любой момент, пока файл хранится (expires_at задания).
  • Опрашивайте статус не чаще раза в 2–3 секунды или используйте вебхуки.

Объект задания

Задание — один файл, превращаемый в один результат. Его возвращают почти все методы.

{
  "id": "01m6he8nmn6ykgpp3mzh4mek06",
  "state": "done",
  "progress": 100,
  "converter": "mov-mp4",
  "input_name": "clip.mov",
  "input_size": 52428800,
  "output_name": "clip.mp4",
  "output_size": 18874368,
  "expires_at": "2026-11-05T10:00:00Z",
  "input_ready": true
}
ТипОписание
idstringИдентификатор задания, 26 символов.
statestringСостояние — см. таблицу ниже.
stagestringЭтап в работе: fetching, probing, converting, uploading.
progressintПрогресс, 0–100.
converterstringКонвертер, например mov-mp4.
input_namestringИмя исходного файла.
input_sizeintРазмер исходника, байт (у ссылки — после скачивания).
output_namestringИмя результата.
output_sizeintРазмер результата, байт (когда готов).
errorstringКод причины при failed.
expires_attimeКогда файлы будут удалены.
deletedboolФайлы уже удалены.
resultobjectДанные анализа или распознавания (только у scan и transcribe).
input_readyboolИсходник сохранён, по нему можно запускать clips и transcribe.
КодHTTPОписание
awaiting_inputЖдёт загрузки файла.
queuedВ очереди.
leasedОбрабатывается.
done✓Готово, можно скачать.
failed✓Не удалось, причина в error.
canceled✓Отменено.
expired✓Срок хранения истёк или файл так и не загрузили.

Конечные состояния отмечены ✓ — после них задание не меняется.

Конвертеры и настройки

Конвертер называется <из>-<в>: mov-mp4, mp4-mp3, png-webp, docx-pdf, pdf-jpg. Полный список с настройками каждого — GET /registry (сотни пар форматов видео, аудио, изображений и документов). Выбирайте конвертер по расширению исходного файла.

options — объект «ключ: значение». Всё необязательно, пропущенное берёт значение по умолчанию; неизвестный ключ или значение вне списка — 400 invalid_options. Типы настроек в /registry:

ТипОписание
enumstringОдно из values, например "1080".
intnumberЦелое от min до max.
boolbooleantrue или false.
timenumber | stringСекунды (12.5) или "мм:сс" / "чч:мм:сс".
textstringТекст до max символов.
rangesstringОтрезки "начало-конец" в секундах через запятую: "12-27,40.5-70".
assetstringid картинки из POST /assets (водяной знак).
optionsТипОписание
qualityenumВидео: high · medium · small.
target_mbenumВидео: сжать до размера, МБ — 8, 10, 16, 25, 50…
resolutionenumВидео: высота кадра — keep, 2160 … 360.
aspect / fitenumВидео: 9:16, 4:5, 1:1, 16:9; поля blur, обрезка crop или smart (по лицам).
trim_start / trim_endtimeВидео и аудио: обрезать начало и конец.
vcodec / fpsenumВидео: h264 или h265; частота кадров.
no_audio / volumebool / intУбрать звук; громкость 0–300 %.
auto_subs / sub_lang / sub_stylebool / enumВидео: распознать речь и вжечь субтитры; язык; стиль (tiktok, karaoke, beast, lyrics…).
title / wm_text / wm_imagetext / assetВидео: заголовок, текстовый или картинка-водяной знак.
bitrate / sample_rate / channelsenumАудио: 128–320 кбит/с; 44100/48000; mono/stereo.
resize / image_quality / stripenum / int / boolИзображения: ширина; качество 1–100; убрать EXIF.
pages / dpienumPDF в картинки: all или first; 72/150/300.
gif_width / gif_fpsenumGIF: ширина и частота кадров.

Задания

POST /jobs

Создать задание

Передайте либо file (затем загрузите его по upload), либо url — тогда файл скачаем мы и задание сразу встанет в очередь.

В ответе upload — одно из двух:

  • put_url и headers — файл до 64 МБ загружается одним PUT с этими заголовками;
  • part_size, part_count, parts — файл больше загружается частями по part_size байт (последняя короче); в parts первые 50 ссылок, остальные — через POST /jobs/{id}/parts.

Для url блок upload пуст.

Тело запроса (JSON)

ТипОписание
converterобязательноstringКонвертер из /registry, например mov-mp4.
optionsobjectНастройки конвертера.
file.namestringИмя файла (до 1024 символов). С file.size — вместо url.
file.sizeintТочный размер файла в байтах.
urlstringСсылка вместо файла: прямая, Google Drive, Dropbox, YouTube, TikTok, Instagram, Vimeo, X.
webhookstringКуда прислать POST, когда задание завершится.
save_to_driveboolПоложить результат в облако аккаунта, когда он будет готов.
drive_folderstringПапка облака для результата (по умолчанию — верхний уровень).
batch_idstringДобавить задание в существующий пакет (для ZIP и событий).

Пример

curl -s -X POST https://convr.app/api/v1/jobs -H "Authorization: Bearer $CONVR_KEY" -H "Content-Type: application/json" \
  -d '{"converter":"mp4-mp4","options":{"target_mb":"25"},
       "file":{"name":"video.mp4","size":187654321}}'

Ответ

201 Created
{
  "batch_id": "01m6he8m2e…",
  "job": { "id": "01m6he8nmn…", "state": "awaiting_input", … },
  "upload": {
    "put_url": "https://…",
    "headers": { "Content-Type": "video/quicktime" }
  }
}

// a file over 64 MB:
  "upload": {
    "part_size": 16777216,
    "part_count": 32,
    "parts": [{ "n": 1, "url": "https://…" }, …]
  }

Ошибки

  • unknown_converter400 Нет такого конвертера — смотрите GET /registry.
  • invalid_options400 Неизвестная настройка или недопустимое значение.
  • invalid_file400 Не указаны имя или размер файла.
  • invalid_url400 Ссылка не http(s) или вместе с ней передан файл.
  • invalid_webhook400 Адрес вебхука не http(s).
  • file_too_large413 Файл больше, чем позволяет тариф (limit — в байтах).
  • limit_active429 Слишком много заданий выполняется одновременно.
  • limit_daily429 Исчерпан суточный лимит заданий.
  • speech_limit429 Исчерпаны минуты распознавания речи за 30 дней.
  • links_unavailable503 Скачивание с видеосайтов временно недоступно.
PUT {put_url}

Загрузить файл

Запрос идёт напрямую в хранилище — без ключа API, с заголовками из upload.headers. Тело — сам файл, ровно file.size байт. Ссылка действует 15 минут.

При загрузке частями: PUT каждой части по её url, тело — part_size байт (последняя — остаток). Части можно грузить параллельно и в любом порядке; собирать их не нужно.

Пример

curl -X PUT "$PUT_URL" -H "Content-Type: video/mp4" --data-binary @video.mp4

# parts: split -b 16777216 big.mov part_ && upload part_aa to parts[0].url, …
curl -X PUT "$PART_1_URL" --data-binary @part_aa
POST /jobs/{id}/parts

Ещё ссылки на части

Подписанные ссылки для частей с from по to включительно, не больше 50 за раз.

Тело запроса (JSON)

ТипОписание
fromобязательноintНомер первой части (с 1).
toобязательноintНомер последней части.

Пример

curl -s -X POST https://convr.app/api/v1/jobs/JOB/parts -H "Authorization: Bearer $CONVR_KEY" -H "Content-Type: application/json" -d '{"from":51,"to":100}'

Ответ

{ "parts": [{ "n": 51, "url": "https://…" }, …] }

Ошибки

  • bad_range400 from/to вне частей файла или больше 50 за раз.
  • no_upload409 У задания нет незавершённой загрузки частями.
POST /jobs/{id}/uploaded

Запустить после загрузки

Проверяет, что файл загружен целиком и нужного размера, и ставит задание в очередь. Тело не нужно.

Пример

curl -s -X POST https://convr.app/api/v1/jobs/JOB/uploaded -H "Authorization: Bearer $CONVR_KEY"

Ответ

{ "id": "…", "state": "…", … }   // the job object

Ошибки

  • upload_incomplete400 Файл (или часть) не загружен целиком.
  • upload_size_mismatch400 Загружено не столько байт, сколько указано в file.size.
  • already_uploaded409 Задание уже запущено.
GET /jobs/{id}

Статус задания

Текущее состояние, этап и прогресс.

Пример

curl -s https://convr.app/api/v1/jobs/JOB -H "Authorization: Bearer $CONVR_KEY"

Ответ

{ "id": "…", "state": "leased", "stage": "converting", "progress": 42, … }

Ошибки

  • not_found404 Задания нет или оно не ваше.
GET /jobs/{id}/download

Ссылка на результат

Подписанная ссылка CDN на 30 минут (не дольше срока хранения). Скачивание по ней — без ключа. Запрашивайте заново, когда нужно.

Пример

curl -sL "$(curl -s https://convr.app/api/v1/jobs/JOB/download -H "Authorization: Bearer $CONVR_KEY" | jq -r .url)" -o result.mp4

Ответ

{ "url": "https://dl.…/clip.mp4?token=…&expires=…", "expires_at": "2026-11-04T12:30:00Z" }

Ошибки

  • not_ready409 Результата ещё нет: задание не в состоянии done.
  • not_found404 Задания нет или оно не ваше.
POST /jobs/{id}/cancel

Отменить

Останавливает задание, если оно ещё не завершилось.

Пример

curl -s -X POST https://convr.app/api/v1/jobs/JOB/cancel -H "Authorization: Bearer $CONVR_KEY"

Ответ

{ "id": "…", "state": "…", … }   // the job object
DELETE /jobs/{id}

Удалить файлы

Отменяет задание и сразу удаляет исходник и результат, не дожидаясь срока хранения.

Пример

curl -s -X DELETE https://convr.app/api/v1/jobs/JOB -H "Authorization: Bearer $CONVR_KEY"

Ответ

204 No Content

Пакеты

Каждое задание входит в пакет (batch_id в ответе на создание). Передайте тот же batch_id в следующие POST /jobs, чтобы следить за ними одним потоком событий или упаковать в ZIP.

GET /batches/{id}

Задания пакета

Все задания пакета в порядке создания.

Ответ

{ "id": "…", "jobs": [ { "id": "…", "state": "done", … }, … ] }
GET /batches/{id}/events

Поток событий (SSE)

Server-Sent Events: сначала snapshot со всеми заданиями, затем job при каждом изменении. Соединение держится открытым; после обрыва переподключайтесь — снова придёт snapshot.

Пример

curl -N https://convr.app/api/v1/batches/BATCH/events -H "Authorization: Bearer $CONVR_KEY"

Ответ

event: snapshot
data: [{"id":"…","state":"queued",…}]

event: job
data: {"id":"…","state":"leased","stage":"converting","progress":37,…}
POST /batches/{id}/zip

Упаковать в ZIP

Создаёт задание-архив из всех готовых результатов пакета (от двух). Повторный вызов для того же набора вернёт тот же архив.

Ответ

{ "id": "…", "state": "…", … }   // the job object

Ошибки

  • nothing_to_zip400 В пакете меньше двух готовых результатов.
  • zip_too_large413 Архив вышел бы слишком большим.

Облако

Файлы аккаунта без срока хранения, в папках, в пределах места тарифа. Загрузка — как у заданий: ссылка на PUT или части. Файл из облака конвертируется без повторной загрузки, результат ложится в ту же папку.

GET /drive

Содержимое папки

Папки и файлы, путь к папке, занятое место и квота.

Параметры строки запроса

ТипОписание
folderstringПапка; без неё — верхний уровень.
qstringПоиск по имени во всех папках.

Ответ

{ "folder": null, "path": [], "folders": [ { "id": "…", "name": "Работа", "files": 3, "size": 1048576 } ],
  "files": [ { "id": "…", "name": "report.pdf", "size": 52011, "format": "pdf", "state": "ready" } ],
  "used": 1100587, "quota": 2147483648, "count": 4 }
POST /drive/files

Загрузить файл

Резервирует место и выдаёт ссылку для загрузки (как POST /jobs). После загрузки — POST /drive/files/{id}/uploaded.

Тело запроса (JSON)

ТипОписание
nameобязательноstringИмя файла.
sizeобязательноintРазмер в байтах.
folderstringПапка.

Ответ

{ "file": { "id": "…", "state": "uploading", … }, "upload": { "put_url": "…", "headers": { … } } }

Ошибки

  • drive_full
  • drive_unavailable
  • file_too_large413 Файл больше, чем позволяет тариф (limit — в байтах).
POST /drive/files/{id}/convert

Конвертировать из облака

Создаёт задание, которое читает файл прямо из облака; результат кладётся в папку файла (save: false — не класть).

Тело запроса (JSON)

ТипОписание
converterобязательноstringКонвертер для формата файла.
optionsobjectНастройки.
folderstringДругая папка для результата.

Ответ

{ "id": "…", "state": "…", … }   // the job object
POST /jobs/{id}/drive

Результат — в облако

Копирует готовый результат задания в облако (внутри хранилища, без скачивания).

Тело запроса (JSON)

ТипОписание
folderstringПапка.

Ошибки

  • drive_full
  • not_ready409 Результата ещё нет: задание не в состоянии done.
GET /drive/files/{id}/url

Ссылка на скачивание

Подписанная ссылка CDN на время.

Ответ

{ "url": "https://…", "expires_at": "…" }
PATCH /drive/files/{id}

Переименовать или переместить

name и/или folder ("" — верхний уровень). Папки — PATCH /drive/folders/{id} с name и parent.

DELETE /drive/files/{id}

Удалить файл

Сразу освобождает место. Папка удаляется вместе с содержимым: DELETE /drive/folders/{id}.

Клипы и речь

Видео загружается один раз как задание-анализ <формат>-scan, после чего из него можно сколько угодно раз резать клипы и распознавать речь — без повторной загрузки, пока задание хранится.

POST /jobs {"converter":"mp4-scan"}

Анализ видео

Обычное создание задания с конвертером mp4-scan (mov-scan, mkv-scan…). Результат анализа — в поле result готового задания: громкость, смены сцен и лучшие моменты для клипов по 15, 30, 60 и 90 секунд с оценкой 0–100. Анализ загруженного файла не расходует суточный лимит заданий.

Ответ

"result": {
  "duration": 312.4,
  "loudness": [0.12, 0.4, …],
  "scenes": [4.2, 17.9, …],
  "clips": {
    "30": [{ "start": 81.5, "end": 111.5, "score": 100 }, …],
    "60": [ … ]
  }
}
POST /jobs/{id}/clips

Нарезать клипы

{id} — задание scan. Один отрезок даёт MP4, несколько — ZIP с клипами. Доступны настройки видео: aspect (по умолчанию 9:16), fit, quality, заголовок, водяной знак, фильтры, музыка.

Тело запроса (JSON)

ТипОписание
options.rangesобязательноrangesДо 20 отрезков, каждый 1–600 с.
options.*Остальные настройки конвертера <формат>-clips из /registry.
webhookstringКак в POST /jobs.

Пример

curl -s -X POST https://convr.app/api/v1/jobs/SCAN/clips -H "Authorization: Bearer $CONVR_KEY" -H "Content-Type: application/json" \
  -d '{"options":{"ranges":"81.5-111.5,140-170","aspect":"9:16","fit":"smart",
       "title":"Best moments"}}'

Ответ

201 Created
{ "id": "…", "converter": "mp4-clips", "state": "queued", … }

Ошибки

  • not_a_scan400 {id} — не задание анализа (scan).
  • not_uploaded409 Видео задания scan ещё не загружено или не скачано.
  • source_gone409 Задание scan отменено или истекло — файла больше нет.
  • invalid_options400 Неизвестная настройка или недопустимое значение.
  • limit_active429 Слишком много заданий выполняется одновременно.
  • limit_daily429 Исчерпан суточный лимит заданий.
POST /jobs/{id}/transcribe

Распознать речь

{id} — задание scan. Слова с таймкодами приходят в result готового задания. До 20 минут речи за задание; расходует минуты распознавания тарифа.

Тело запроса (JSON)

ТипОписание
options.rangesобязательноrangesКакие отрезки распознать.
options.langenumauto, ru, uk, en, de, es, fr, it, pl, pt, tr, kk, be.

Пример

curl -s -X POST https://convr.app/api/v1/jobs/SCAN/transcribe -H "Authorization: Bearer $CONVR_KEY" -H "Content-Type: application/json" -d '{"options":{"ranges":"0-60","lang":"auto"}}'

Ответ

"result": {
  "language": "ru",
  "clips": [{
    "start": 0, "end": 60,
    "words": [{ "w": "Привет", "s": 0.32, "e": 0.71 }, …]
  }]
}

Ошибки

  • speech_too_long400 Больше 20 минут речи (limit — секунды).
  • speech_limit429 Исчерпаны минуты распознавания речи за 30 дней.
  • speech_unavailable503 Распознавание речи временно недоступно.
  • not_a_scan400 {id} — не задание анализа (scan).

Справочники и аккаунт

GET /registry

Форматы и конвертеры

Все форматы, конвертеры и их настройки. Ключ не обязателен. Меняется редко — можно кешировать по version.

Ответ

{
  "version": 14,
  "formats": [{"id": "mov", "ext": "mov", "kind": "video", "mime": "video/quicktime"}, …],
  "converters": [{
    "id": "mov-mp4", "from": "mov", "to": "mp4", "engine": "ffmpeg",
    "options": [
      {"key": "quality", "type": "enum", "values": ["high", "medium", "small"], "default": "medium"},
      {"key": "trim_start", "type": "time", "max": 86400},
      …
    ]
  }, …],
  "tools": [ … ]
}
GET /limits

Лимиты тарифа

Лимиты вашего тарифа и израсходованные секунды распознавания.

Ответ

{
  "max_file_bytes": 10737418240,
  "max_jobs_day": 500,
  "max_active": 10,
  "max_duration_s": 14400,
  "retention_h": 72,
  "speech_minutes": 600,
  "speech_used_s": 1834.5
}
GET /account/jobs

История

Задания аккаунта, от новых к старым, по 50. Для следующей страницы передайте created_at последнего в before.

Параметры строки запроса

ТипОписание
beforetimeКурсор: RFC 3339.

Ответ

{ "jobs": [{ "id": "…", "state": "done", …, "created_at": "2026-11-04T09:12:44.123Z" }, …] }

Ошибки

  • bad_cursor400 before — не время RFC 3339.
POST /assets

Картинка для водяного знака

Тело — PNG до 2 МБ и 2048×2048 (Content-Type: image/png). Полученный id передавайте в options.wm_image.

Пример

curl -s -X POST https://convr.app/api/v1/assets -H "Authorization: Bearer $CONVR_KEY" -H "Content-Type: image/png" --data-binary @logo.png

Ответ

201 Created
{ "id": "…", "width": 512, "height": 512 }

Ошибки

  • invalid_image400 Не PNG или больше 2048×2048.
  • file_too_large413 Файл больше, чем позволяет тариф (limit — в байтах).
  • too_many_assets429 Слишком много картинок за сутки.

Вебхуки

Передайте webhook при создании задания (или клипов). Когда задание придёт в конечное состояние, мы отправим на этот адрес POST с JSON.

  • события: job.done, job.failed, job.canceled, job.expired;
  • у job.done есть download_url — ссылка на результат на 30 минут; позже берите новую через /download;
  • ответьте любым 2xx за 10 секунд. Иначе повторим: через 10 с, 40 с, ~3 мин, ~11 мин и ~43 мин — всего 6 попыток;
  • адрес должен быть публичным: внутренние сети и редиректы не поддерживаются;
  • одно событие может прийти дважды (например, при сетевом сбое после вашего ответа) — проверяйте job.id.

Каждый вызов подписан: X-Convr-Signature: sha256=<hex> — HMAC-SHA256 сырого тела запроса с секретом whsec_… из кабинета. Проверяйте подпись до разбора JSON и сравнивайте за постоянное время.

POST /hooks/convr HTTP/1.1
Content-Type: application/json
User-Agent: convr-webhook
X-Convr-Event: job.done
X-Convr-Job: 01m6he8nmn6ykgpp3mzh4mek06
X-Convr-Signature: sha256=5d41402abc4b2a76b9719d911017c592…

{
  "event": "job.done",
  "job": { "id": "01m6he8nmn6ykgpp3mzh4mek06", "state": "done", "output_name": "clip.mp4", … },
  "download_url": "https://dl.…/clip.mp4?token=…",
  "sent_at": "2026-11-04T10:15:02Z"
}
import hashlib, hmac, os
from flask import Flask, abort, request

SECRET = os.environ["CONVR_WEBHOOK_SECRET"].encode()
app = Flask(__name__)

@app.post("/hooks/convr")
def convr_hook():
    sig = "sha256=" + hmac.new(SECRET, request.get_data(), hashlib.sha256).hexdigest()
    if not hmac.compare_digest(sig, request.headers.get("X-Convr-Signature", "")):
        abort(401)
    e = request.get_json()
    if e["event"] == "job.done":
        print(e["job"]["id"], e["download_url"])
    return "", 204

Ошибки

Ошибка запроса — HTTP-статус 4xx/5xx и тело {"error": "код"}. У ошибок лимитов есть ещё limit — число, в которое вы упёрлись. Опирайтесь на код, а не на текст: коды не меняются.

HTTP/1.1 429 Too Many Requests
{"error": "limit_active", "limit": 10}
КодHTTPОписание
invalid_key401Ключ не найден, отозван или аккаунт отключён.
plan_required403Тариф аккаунта без API.
not_for_keys403Этот метод доступен только на сайте.
rate_limited429Больше 120 запросов в минуту. Подождите Retry-After секунд.
limit_active429Слишком много заданий выполняется одновременно.
limit_daily429Исчерпан суточный лимит заданий.
speech_limit429Исчерпаны минуты распознавания речи за 30 дней.
file_too_large413Файл больше, чем позволяет тариф (limit — в байтах).
json_required415Нет заголовка Content-Type: application/json.
bad_json400Тело — не JSON или поля не того типа.
unknown_converter400Нет такого конвертера — смотрите GET /registry.
invalid_options400Неизвестная настройка или недопустимое значение.
invalid_file400Не указаны имя или размер файла.
invalid_url400Ссылка не http(s) или вместе с ней передан файл.
invalid_webhook400Адрес вебхука не http(s).
not_found404Задания нет или оно не ваше.
already_uploaded409Задание уже запущено.
upload_incomplete400Файл (или часть) не загружен целиком.
upload_size_mismatch400Загружено не столько байт, сколько указано в file.size.
not_ready409Результата ещё нет: задание не в состоянии done.
links_unavailable503Скачивание с видеосайтов временно недоступно.
speech_unavailable503Распознавание речи временно недоступно.
internal500Сбой на нашей стороне. Повторите позже.

Если задание завершилось с state: "failed", причина — в поле error задания:

КодОписание
input_invalidФайл повреждён или не читается.
input_format_mismatchВнутри файла другой формат, чем у конвертера.
input_no_streamНет нужной дорожки (например, звука для mp4-mp3).
input_encryptedАрхив защищён паролем.
input_too_longВидео длиннее, чем позволяет тариф.
input_too_largeСкачанный по ссылке файл больше лимита тарифа.
input_resolutionСлишком большое разрешение.
target_too_smallВидео не уместить в target_mb даже с минимальным качеством.
output_too_largeРезультат вышел больше лимита.
convert_failedКонвертация не удалась (после повторов на разных серверах).
timeoutОбработка заняла слишком долго.
url_unreachableСсылка не открывается.
url_blockedСсылка ведёт во внутреннюю сеть — запрещено.
no_videoПо ссылке нет видео (пост с фото).
url_privateВидео приватное, удалено, с возрастным или региональным ограничением.
site_blockedСайт временно не отдаёт видео. Повторите позже.
fetch_failedНе удалось получить загруженный файл.
speech_too_longБольше 20 минут речи в одном задании.
worker_lostСервер обработки пропал; задание обычно перезапускается само.
internalВнутренняя ошибка.