{"format":"voicer-api-guide/1","title":"Voicer API v2","version":"2","language":"ru","base_url":"https://voicer.mat3u.com","summary":"Озвучка текста голосами ElevenLabs и Cartesia, клонирование голосов, субтитры, музыка и звуковые эффекты.","conventions":{"auth":{"token":"Authorization: Bearer <токен>","none":"без авторизации","signed":"подпись exp и sig в query, токен не нужен"},"markup":"`код` и [текст](#якорь), якорь ссылается на id раздела, темы или эндпоинта","error_body":{"detail":{"code":"string","message":"string"}}},"llm_notes":["Все пути относительно base_url. Авторизация: заголовок Authorization: Bearer <токен>, кроме эндпоинтов с auth = none или signed.","Ошибки: тело {\"detail\": {\"code\", \"message\", ...}}; ветвиться по code, список в error_codes.","Диалоги: POST /v2/dialogues с engine labs или cartesia; статус и скачивание как у задач.","Озвучка асинхронная: POST /v2/tasks, активные GET /v2/tasks, опрос GET /v2/tasks/{task_id} раз в 2-5 с до конечного статуса, затем GET /v2/tasks/{task_id}/download.","Примеры python используют python_preamble: сессию requests s и BASE.","Значения params[].default записаны JSON-литералами.","Музыка и эффекты синхронные и без списания символов: POST /v2/music и POST /v2/sound-effects доступны при активной подписке."],"python_preamble":"import os\nimport time\n\nimport requests\n\nBASE = \"https://voicer.mat3u.com\"\ns = requests.Session()\ns.headers[\"Authorization\"] = f\"Bearer {os.environ['VOICER_TOKEN']}\"\n","sections":[{"id":"start","title":"Начало работы","intro":["Voicer API озвучивает текст голосами ElevenLabs и Cartesia, клонирует голоса и делает субтитры. Озвучка асинхронная: вы создаёте задачу, опрашиваете её статус и скачиваете MP3, когда она готова."],"topics":[{"id":"base-url","title":"Адрес и формат","paragraphs":["Базовый адрес: `https://voicer.mat3u.com`. Все пути начинаются с `/v2`. Запросы и ответы в JSON (UTF-8), кроме загрузки файлов (`multipart/form-data`) и скачивания аудио и субтитров.","Даты в ответах в формате ISO 8601 с часовым поясом UTC, например `2026-10-11T16:34:08.984299Z`.","Списки с пагинацией принимают `page` (с нуля) и `page_size` (1-50) и возвращают `has_more`: пока он `true`, запрашивайте следующую страницу."],"table":null,"code":[]},{"id":"auth","title":"Авторизация","paragraphs":["Каждый запрос, кроме отмеченных «без токена», передаёт API-токен в заголовке `Authorization: Bearer <токен>`. Токен выдаёт Telegram-бот Voicer. Один токен соответствует одной лицензии: у неё свой баланс, тариф и лимит одновременных задач.","Без заголовка или с неверным токеном API отвечает `401` с `WWW-Authenticate: Bearer`. Проверить, чей токен, можно через [GET /v2/auth/me](#auth-me)."],"table":null,"code":[{"language":"bash","code":"curl https://voicer.mat3u.com/v2/auth/me \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","title":null}]},{"id":"errors-format","title":"Формат ошибок","paragraphs":["Ошибка бизнес-логики приходит с HTTP-статусом и телом `{\"detail\": {\"code\": \"...\", \"message\": \"...\"}}`. `code` стабилен, по нему стоит ветвить логику клиента; `message` написан для человека и может меняться. Рядом с ними бывают поля с подробностями, например `required` и `available` при нехватке символов. Полный список кодов в разделе [Коды ошибок](#error-codes).","Ошибка авторизации приходит строкой: `{\"detail\": \"Недействительный токен\"}`.","Неверный тип или формат поля даёт `422` в стандартном формате FastAPI: `{\"detail\": [{\"loc\": [\"body\", \"max_chunk_length\"], \"msg\": \"...\", \"type\": \"...\"}]}`. Лишние поля в JSON-телах задач запрещены и тоже дают `422`."],"table":null,"code":[{"language":"json","code":"{\n  \"detail\": {\n    \"code\": \"insufficient_characters\",\n    \"message\": \"Недостаточно символов: нужно 12000, осталось 3400\",\n    \"required\": 12000,\n    \"available\": 3400\n  }\n}","title":"402 Payment Required"}]},{"id":"quickstart","title":"Быстрый старт на Python","paragraphs":["Полный цикл: создать задачу, дождаться результата и сохранить MP3. Остальные примеры на Python в этом справочнике используют сессию `s` и переменную `BASE` из этого кода. Нужен пакет `requests` и переменная окружения `VOICER_TOKEN`."],"table":null,"code":[{"language":"python","code":"import os\nimport time\n\nimport requests\n\nBASE = \"https://voicer.mat3u.com\"\ns = requests.Session()\ns.headers[\"Authorization\"] = f\"Bearer {os.environ['VOICER_TOKEN']}\"\n\n\ndef synthesize(text: str, voice_id: str, out_path: str) -> None:\n    created = s.post(f\"{BASE}/v2/tasks\", json={\"text\": text, \"voice_id\": voice_id}, timeout=60)\n    if created.status_code != 202:\n        raise RuntimeError(created.json()[\"detail\"])\n    task_id = created.json()[\"task_id\"]\n\n    while True:\n        task = s.get(f\"{BASE}/v2/tasks/{task_id}\", timeout=30).json()\n        if task[\"status\"] in (\"pending\", \"processing\", \"pending_confirmation\"):\n            time.sleep(3)\n            continue\n        break\n\n    if task[\"status\"] == \"censored\":\n        # Перепишите заблокированные фрагменты и отправьте их в /retry (раздел «Задачи»).\n        raise RuntimeError(f\"Цензура: {task['blocked_chunks']}\")\n    if task[\"status\"] != \"completed\":\n        raise RuntimeError(f\"Задача {task['status']}: {task['error']}\")\n\n    with s.get(f\"{BASE}/v2/tasks/{task_id}/download\", stream=True, timeout=600) as r:\n        r.raise_for_status()\n        with open(out_path, \"wb\") as f:\n            for piece in r.iter_content(1 << 16):\n                f.write(piece)\n\n\nsynthesize(\"Привет! Это тест Voicer API.\", \"JBFqnCBsd6RMkjVDRZzb\", \"voice.mp3\")\n","title":null}]},{"id":"llm","title":"Справочник для нейросети","paragraphs":["Весь этот справочник в машиночитаемом виде лежит по адресу [/docs.json](/docs.json): разделы, эндпоинты, параметры со всеми значениями, примеры на curl и Python, ошибки и нюансы. Передайте файл модели целиком как контекст. OpenAPI-схема для генераторов клиентов: [/openapi.json](/openapi.json), интерактивный Swagger: [/docs/swagger](/docs/swagger)."],"table":null,"code":[]}],"endpoints":[],"nuances":[]},{"id":"concepts","title":"Основные понятия","intro":[],"topics":[{"id":"engines","title":"Движки озвучки","paragraphs":["Параметр `engine` задачи выбирает провайдера. От движка зависят допустимые голоса, модели и максимальный размер чанка.","Если `engine` не указан, берётся `original`, а на тарифе без него (например, Cartesia) `cartesia`. Движок, закрытый тарифом, даёт `403` с кодом `engine_not_allowed`. Что разрешено вашей лицензии, смотрите в `tariff` ответа [GET /v2/billing/me](#billing-me)."],"table":{"columns":["engine","Провайдер","Голоса","Модель по умолчанию"],"rows":[["`original`","ElevenLabs","Стандартные голоса ElevenLabs ([список](#voices-elevenlabs))","`eleven_multilingual_v2`"],["`cartesia`","Cartesia","Стандартные голоса Cartesia, свои клоны и общий каталог клонов","`sonic-3.6`"]]},"code":[]},{"id":"characters","title":"Символы, пакеты и лицензия","paragraphs":["Озвучка тарифицируется в символах исходного текста: `len(text)`, включая пробелы и переносы строк. Символы списываются сразу при создании задачи и возвращаются, если задачу отменили до начала озвучки, если её не удалось поставить в очередь или если озвучка закончилась статусом `failed`.","Символы лежат в пакетах, у каждого свой срок. Списание идёт из пакета, который сгорает раньше. На безлимитной подписке символы не списываются (`charged_characters = 0`), но действуют лимиты тарифа.","Лимиты тарифа: одновременных задач на лицензию (`max_parallel_tasks`), символов в задаче (`max_chars_per_task`), чанков в задаче (`max_chunks_per_task`), разрешённые движки и квота своих клонов Cartesia (`max_cartesia_clones`). `null` в лимите означает «без ограничения»."],"table":null,"code":[]},{"id":"lifecycle","title":"Жизненный цикл задачи","paragraphs":["Задача проходит статусы `pending` (в очереди), `processing` (озвучивается) и заканчивается одним из конечных. Опрашивайте [GET /v2/tasks/{task_id}](#tasks-get) раз в 2-5 секунд."],"table":{"columns":["Статус","Что значит","Что делать"],"rows":[["`pending`","В очереди, символы списаны","Ждать. Можно отменить"],["`processing`","Озвучивается, растёт `progress_percent`","Ждать"],["`pending_confirmation`","Основной TTS временно деградировал, задача ждёт решения оператора","Ждать, задача продолжится или завершится сама"],["`completed`","Готово","Скачать результат"],["`censored`","ElevenLabs заблокировал часть фрагментов, остальное озвучено","Исправить текст фрагментов из `blocked_chunks` и вызвать /retry"],["`failed`","Ошибка, подробности в `error`; символы возвращены","Создать задачу заново"],["`cancelled`","Отменена","Ничего"]]},"code":[]},{"id":"chunks","title":"Чанки","paragraphs":["Перед озвучкой текст режется на чанки, каждый озвучивается отдельным запросом к провайдеру, затем чанки склеиваются в один MP3. Как резать, задают `split_type` и `max_chunk_length`. Число чанков возвращается в `chunks_count` и ограничено тарифом.","От чанков зависят паузы (`auto_pause` вставляет тишину после каждого N-го чанка), режим `split_output` (ZIP с MP3 на каждый чанк) и повтор после цензуры (переозвучиваются только заблокированные чанки)."],"table":null,"code":[]}],"endpoints":[],"nuances":[]},{"id":"account","title":"Аккаунт и баланс","intro":["Баланс и лимиты считаются по лицензии, то есть по токену из заголовка. У одного пользователя может быть несколько токенов с разными тарифами."],"topics":[],"endpoints":["auth-me","billing-me","billing-stats","billing-tariffs"],"nuances":["parallel-limit"]},{"id":"voices","title":"Голоса ElevenLabs и модели","intro":["Для `engine=original` подходят стандартные голоса ElevenLabs из таблицы ниже. Библиотека ElevenLabs (поиск и подборка) нужна, чтобы найти голос для клона Cartesia."],"topics":[{"id":"elevenlabs-voices-table","title":"Стандартные голоса ElevenLabs","paragraphs":["Все голоса многоязычные и говорят по-русски на моделях `eleven_multilingual_v2`, `eleven_v3` и новее."],"table":{"columns":["Имя","voice_id"],"rows":[["Adam","`pNInz6obpgDQGcFmaJgB`"],["Alice","`Xb7hH8MSUJpSbSDYk0k2`"],["Bella","`hpp4J3VqNfWAUOO0d1Us`"],["Bill","`pqHfZKP75CvOlQylNhV4`"],["Brian","`nPczCjzI2devNBz1zQrb`"],["Callum","`N2lVS1w4EtoT3dr4eOWO`"],["Charlie","`IKne3meq5aSn9XLyUdCD`"],["Chris","`iP95p4xoKVk53GoZ742B`"],["Daniel","`onwK4e9ZLuTAKqWW03F9`"],["Eric","`cjVigY5qzO86Huf0OWal`"],["George","`JBFqnCBsd6RMkjVDRZzb`"],["Harry","`SOYHLrjzK2X1ezoPC6cr`"],["Jessica","`cgSgspJ2msm6clMCkdW9`"],["Laura","`FGY2WhTYpPnrIDTdsKH5`"],["Liam","`TX3LPaxmHKxFdv7VOQHJ`"],["Lily","`pFZP5JQG7iQjIQuC4Bku`"],["Matilda","`XrExE9yKIg1WjnnlVkGX`"],["River","`SAz9YHcvj6GT2YYXdXww`"],["Roger","`CwhRBWXzGAHq8TQ4Fs17`"],["Sarah","`EXAVITQu4vr4xnSDxMaL`"],["Will","`bIHbv24MWmeRgasZH58o`"]]},"code":[]},{"id":"models-table","title":"Модели по движкам","paragraphs":["Без `model_id` берётся модель по умолчанию. Для `cartesia` модель ElevenLabs (`eleven_*`) молча заменяется на `sonic-3.6`, а снятые модели (`sonic`, `sonic-2*`, `sonic-turbo*`, `sonic-english` и т.п.) дают `400` с кодом `invalid_model`. Датированные снимки вида `sonic-3.6-ГГГГ-ММ-ДД` принимаются."],"table":{"columns":["Движок","По умолчанию","Остальные"],"rows":[["`original`","`eleven_multilingual_v2`","`eleven_english_v1`, `eleven_flash_v2`, `eleven_flash_v2_5`, `eleven_multilingual_v1`, `eleven_turbo_v2`, `eleven_turbo_v2_5`, `eleven_v3`, `eleven_v4`, `eleven_v4_turbo`"],["`cartesia`","`sonic-3.6`","`sonic-3`, `sonic-3-2026-01-12`, `sonic-3.5`, `sonic-3.5-2026-05-04`, `sonic-3.6-2026-08-27`, `sonic-preview`"]]},"code":[]}],"endpoints":["voices-elevenlabs","voices-elevenlabs-search","voices-elevenlabs-featured","voices-models"],"nuances":["library-voices-original"]},{"id":"cartesia","title":"Голоса Cartesia","intro":["Для `engine=cartesia` подходят голоса трёх видов: стандартные голоса Cartesia, свои клоны и общий каталог клонов голосов ElevenLabs. Все списки требуют тарифа, разрешающего движок cartesia."],"topics":[{"id":"cartesia-voice-kinds","title":"Какой voice_id передавать в задачу","paragraphs":["В `voice_id` задачи с `engine=cartesia` можно передать любой из трёх ID. Если передан ID голоса ElevenLabs, сервис сам найдёт его готовый клон: сначала свой, затем из общего каталога."],"table":{"columns":["Что передаёте","Пример","Откуда взять"],"rows":[["ID клона Cartesia","`8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36`","Каталог, мои клоны, ответ /clone"],["ID стандартного голоса","`f786b574-daa5-4673-aa0c-cbe3e8534c02`","/v2/voices/cartesia/standard"],["ID голоса ElevenLabs, у которого есть клон","`Wu3B7bOkdHbKnJTvbiFk`","Поиск ElevenLabs, затем /clone или /from-labs"]]},"code":[]}],"endpoints":["cartesia-voices","cartesia-catalog","cartesia-mine","cartesia-standard","cartesia-voice","cartesia-preview"],"nuances":["labs-clone-slots","labs-id-in-task"]},{"id":"cloning","title":"Клонирование голосов","intro":["Клон Cartesia создаётся двумя способами, и они по-разному расходуют квоту тарифа (`max_cartesia_clones`)."],"topics":[{"id":"clone-kinds","title":"Свой клон и клон из ElevenLabs","paragraphs":[],"table":{"columns":["","Свой клип","elevenlabs_voice_id"],"rows":[["Слот клона","Занимает","Не занимает"],["Кому виден","Только вам","Всем, попадает в общий каталог"],["Аудио","Обязательно, 10-60 с","Необязательно: берётся семпл ElevenLabs"],["Повтор","Каждый раз новый клон","Возвращается готовый (`reused: true`)"],["Удаление","DELETE освобождает слот","Нельзя (`403 shared_clone`)"]]},"code":[]}],"endpoints":["cartesia-clone","cartesia-from-labs","cartesia-delete"],"nuances":["labs-clone-slots","clone-slots-count","clone-languages"]},{"id":"tasks","title":"Задачи озвучки","intro":["Задача принадлежит лицензии (токену), который её создал. Чужие задачи для API не существуют и дают `404`. Незавершённые задачи текущего ключа: [GET /v2/tasks](#tasks-list)."],"topics":[{"id":"censorship","title":"Цензура и повтор","paragraphs":["ElevenLabs иногда отказывается озвучивать отдельные фрагменты. Тогда задача заканчивается статусом `censored`: озвученные чанки сохранены, а заблокированные перечислены в `blocked_chunks`. Перепишите их текст и отправьте в [/retry](#tasks-retry): переозвучатся только они.","Повтор бесплатен, если новый текст не длиннее исходного. Если длиннее, списывается только разница. Без доплаты повтор работает даже после окончания подписки. Данные для повтора хранятся вместе с задачей (30 дней)."],"table":null,"code":[{"language":"python","code":"task = s.get(f\"{BASE}/v2/tasks/{task_id}\", timeout=30).json()\nif task[\"status\"] == \"censored\":\n    fixed = [\n        {\"index\": c[\"index\"], \"text\": rewrite(c[\"text\"])}  # rewrite: ваша замена слов\n        for c in task[\"blocked_chunks\"]\n    ]\n    r = s.post(f\"{BASE}/v2/tasks/{task_id}/retry\", json={\"corrected_chunks\": fixed}, timeout=60)\n    r.raise_for_status()\n    # дальше снова опрашивайте статус до completed\n","title":"Повтор на Python"}]},{"id":"dubbing","title":"Дубляж","paragraphs":["С `dub_languages` задача озвучивает текст, потом переводит его на каждый язык и озвучивает перевод. По умолчанию тем же голосом (у Cartesia клоном на языке дорожки); в `dub_voices` можно задать другой `voice_id` на язык, чтобы не было акцента. Перевод подгоняется под длительность каждого чанка оригинала: если он выходит длиннее, модель сокращает формулировку, а не ускоряет речь. В конце чанки всех дорожек дополняются тишиной до самого длинного, поэтому файлы совпадают по длине и ложатся на одно видео.","Пример: оригинал голосом `JBFqnCBsd6RMkjVDRZzb`, английский `pNInz6obpgDQGcFmaJgB`, немецкий `EXAVITQu4vr4xnSDxMaL`. Язык без ключа в `dub_voices` остаётся голосом оригинала (у Cartesia клоном на языке дорожки).","Сначала озвучивается весь оригинал, потом языки по одному. Прогресс каждой дорожки виден в `dubs` основной задачи. Основная задача и дорожки становятся `completed` одновременно, когда длина выровнена.","У каждой дорожки свой `task_id`: [/download](#tasks-download), [/subtitles](#tasks-subtitles) и [/v2/captions](#captions-create) работают с ним как с обычной задачей. Для `engine=original` у дорожек есть метки ElevenLabs: субтитры приходят сразу и совпадают с выровненным аудио. Для Cartesia субтитры делаются распознаванием через /v2/captions.","Стоимость: длина текста × (1 + 1.5 × число языков), списывается с основной задачи при создании. Если дубляж закончился `failed`, символы возвращаются. Дорожку нельзя отменить отдельно, только вместе с основной задачей.","Языки зависят от движка и модели. Eleven v3 и v4 говорят на всех языках дубляжа, Multilingual v2, Flash v2.5 и Turbo v2.5 на своём списке, Cartesia на языках Sonic. Недоступный язык даёт `400 unsupported_dub_language` со списком `available`. Для Cartesia язык дубляжа не может совпадать с `language` текста."],"table":null,"code":[{"language":"python","code":"import time\nfrom pathlib import Path\n\nbody = {\n    \"text\": text,\n    \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\",  # оригинал: George\n    \"model_id\": \"eleven_v3\",\n    \"dub_languages\": [\"en\", \"de\"],\n    \"dub_voices\": {\n        \"en\": \"pNInz6obpgDQGcFmaJgB\",  # английский: Adam, не голос оригинала\n        \"de\": \"EXAVITQu4vr4xnSDxMaL\",  # немецкий: Sarah\n    },\n}\nr = s.post(f\"{BASE}/v2/tasks\", json=body, timeout=60)\nr.raise_for_status()\ntask = r.json()\ntracks = {\"original\": task[\"task_id\"]} | {d[\"language\"]: d[\"task_id\"] for d in task[\"dubs\"]}\n\nfinal = (\"completed\", \"censored\", \"failed\", \"cancelled\")\nwhile s.get(f\"{BASE}/v2/tasks/{task['task_id']}\", timeout=30).json()[\"status\"] not in final:\n    time.sleep(5)\n\n# аудио и метки всех дорожек хранятся час после последнего языка\nfor name, track_id in tracks.items():\n    audio = s.get(f\"{BASE}/v2/tasks/{track_id}/download\", timeout=600)\n    audio.raise_for_status()\n    Path(f\"{name}.mp3\").write_bytes(audio.content)\n    srt = s.get(f\"{BASE}/v2/tasks/{track_id}/subtitles\", params={\"format\": \"srt\"}, timeout=60)\n    if srt.status_code == 200:  # у Cartesia меток нет: 409, тогда POST /v2/captions\n        Path(f\"{name}.srt\").write_bytes(srt.content)\n","title":"Дубляж на Python: все файлы и субтитры"}]}],"endpoints":["tasks-create","tasks-list","tasks-get","tasks-cancel","tasks-retry"],"nuances":["labs-id-in-task","clone-languages","library-voices-original","charge-on-create","cancel-processing","parallel-limit","cartesia-chunk","cjk-chunk","quotes","voice-settings-cartesia","auto-pause","censored-retry","pending-confirmation","maintenance","strict-body"]},{"id":"dialogues","title":"Диалоги","intro":["Диалог: это обычная задача озвучки из реплик разных голосов. Статус, скачивание и отмена идут через эндпоинты задач, а символы списываются так же, как за обычный текст той же длины."],"topics":[{"id":"dialogue-engines","title":"Движки и голоса","paragraphs":["`labs` озвучивает диалог через ElevenLabs text-to-dialogue. Голоса: стандартные голоса ElevenLabs, аудио-теги вроде `[excited]` и `[laughs]` модель отыгрывает. Модель по умолчанию `eleven_v4`, также доступны `eleven_v4_turbo` и `eleven_v3`.","`cartesia` озвучивает каждую реплику отдельным запросом Cartesia TTS и склеивает их. Голос реплики: ID клона, стандартный голос Cartesia или ID голоса ElevenLabs, у которого есть клон. Язык определяет, какой клон взять: если клона на языке текста нет, славянские языки озвучиваются ru-клоном, остальные: en-клоном, а язык синтеза остаётся языком текста. У стандартных голосов Cartesia язык свой, и чужой текст они читают с акцентом. Теги смеха и эмоций Cartesia понимает, остальные теги вырезаются.","Длинный диалог режется на части: у `labs` до 1000 символов на запрос, у `cartesia` до 500, реплики без нужды не разрываются. В диалоге не больше 10 разных голосов. Субтитров у диалогов нет: ответ провайдера без таймингов."],"table":null,"code":[{"language":"python","code":"created = s.post(f\"{BASE}/v2/dialogues\", json=body, timeout=60).json()\ntask_id = created[\"task_id\"]\nwhile True:\n    task = s.get(f\"{BASE}/v2/tasks/{task_id}\", timeout=30).json()\n    if task[\"status\"] in {\"completed\", \"failed\", \"cancelled\", \"censored\"}:\n        break\n    time.sleep(3)\nfile = s.get(f\"{BASE}/v2/tasks/{task_id}/download\", timeout=180)\n","title":"Дождаться результата"}]},{"id":"dialogue-text","title":"Как писать текст","paragraphs":["В `text` реплика начинается со строки `[voice_id]: текст`. `voice_id` это тот же ID голоса, что в обычной задаче. Строка без пометки в начале продолжает предыдущую реплику, так реплика занимает несколько строк. Пустые строки в начале текста пропускаются."],"table":null,"code":[{"language":"text","code":"[EXAVITQu4vr4xnSDxMaL]: [excited] Have you heard about dialogues?\n[CwhRBWXzGAHq8TQ4Fs17]: [laughs] I have.\nLet's check how it sounds.","title":"Текст диалога целиком"}]}],"endpoints":["dialogues-create"],"nuances":["dialogue-retry"]},{"id":"results","title":"Результат","intro":["Скачивать можно только задачу `completed`. Аудио хранится ограниченное время после завершения, затем удаляется и /download отвечает `410 result_expired`. Скачивайте результат сразу, как задача готова."],"topics":[],"endpoints":["tasks-download","tasks-download-link","tasks-file"],"nuances":["split-output","download-first","result-retention"]},{"id":"subtitles","title":"Субтитры","intro":["Есть два способа получить субтитры к озвучке. Они отличаются скоростью и движками, для которых работают."],"topics":[{"id":"subtitles-choice","title":"Какой способ выбрать","paragraphs":["Надёжная стратегия: сначала запросить /subtitles, а при `409 no_timestamps` перейти на /v2/captions."],"table":{"columns":["","/v2/tasks/{task_id}/subtitles","/v2/captions"],"rows":[["Источник","Метки ElevenLabs при озвучке","Распознавание речи"],["Движки","Только `original`","Любые, включая `cartesia`"],["Скорость","Мгновенно","Секунды или минуты"],["Форматы","`srt`, `vtt`, `json`","`srt`, `vtt`"],["Статус задачи","`completed` или `censored`","Готовая озвучка"]]},"code":[]}],"endpoints":["tasks-subtitles","captions-create","captions-upload"],"nuances":["auto-pause","split-output","result-retention","cartesia-subtitles"]},{"id":"studio","title":"Музыка и эффекты","intro":["Генерация музыки и коротких звуков. Оба метода синхронные, без очереди задач и без списания символов. Нужна активная подписка."],"topics":[],"endpoints":["studio-music","studio-sound"],"nuances":["studio-subscription"]},{"id":"error-codes","title":"Коды ошибок","intro":["Значение `detail.code` в ответе с ошибкой. Ветвите логику клиента по коду, а не по тексту `message`. Ответы `401` без кода и `422` валидации описаны в разделе [Формат ошибок](#errors-format)."],"topics":[],"endpoints":[],"nuances":[]}],"endpoints":[{"id":"auth-me","method":"GET","path":"/v2/auth/me","title":"Чей это токен","summary":"Возвращает пользователя и лицензию, которым принадлежит токен. Удобно для проверки токена при старте клиента.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"user_id","type":"string","description":"ID пользователя"},{"name":"token_id","type":"integer","description":"ID лицензии (API-токена)"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка или токен недействителен"}],"examples":[{"title":"Проверить токен","curl":"curl \"https://voicer.mat3u.com/v2/auth/me\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/auth/me\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"user_id\": \"3f6c2a9e-8d41-4b7a-9c55-1e2f0a7d4b13\",\n  \"token_id\": 5521\n}"}],"notes":[],"section":"account","anchor":"#auth-me"},{"id":"billing-me","method":"GET","path":"/v2/billing/me","title":"Баланс и тариф лицензии","summary":"Подписка, тариф и остаток символов лицензии из заголовка Authorization. Перед большой задачей проверьте `remaining_characters` и лимиты `tariff`.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"user_id","type":"string","description":"ID пользователя"},{"name":"user_active","type":"boolean","description":"`false`: пользователь заблокирован"},{"name":"token_id","type":"integer | null","description":"Лицензия, для которой посчитан баланс"},{"name":"subscription_type","type":"string","description":"`characters`, `unlimited` или `no_subscription`"},{"name":"subscription_expires_at","type":"datetime | null","description":"Конец безлимитной подписки"},{"name":"subscription_active","type":"boolean","description":"Можно ли сейчас ставить задачи (подписка и баланс)"},{"name":"total_characters","type":"integer","description":"Начислено в действующих пакетах"},{"name":"used_characters","type":"integer","description":"Списано из действующих пакетов"},{"name":"remaining_characters","type":"integer","description":"Остаток"},{"name":"tariff","type":"object | null","description":"Лимиты тарифа, как в /v2/billing/tariffs"},{"name":"packages","type":"array","description":"Действующие пакеты с остатком в порядке списания, у каждого свой срок"},{"name":"tariff_code","type":"string | null","description":"Код тарифа"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":null,"when":"Пользователь токена не найден"}],"examples":[{"title":"Пакет символов","curl":"curl \"https://voicer.mat3u.com/v2/billing/me\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/billing/me\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"user_id\": \"3f6c2a9e-8d41-4b7a-9c55-1e2f0a7d4b13\",\n  \"user_active\": true,\n  \"token_id\": 5521,\n  \"subscription_type\": \"characters\",\n  \"subscription_expires_at\": null,\n  \"subscription_active\": true,\n  \"total_characters\": 1000000,\n  \"used_characters\": 412870,\n  \"remaining_characters\": 587130,\n  \"tariff_code\": \"characters\",\n  \"tariff\": {\n    \"code\": \"characters\",\n    \"name\": \"Characters\",\n    \"kind\": \"package\",\n    \"max_parallel_tasks\": 5,\n    \"threads_per_task\": 15,\n    \"max_chunks_per_task\": null,\n    \"max_chars_per_task\": 200000,\n    \"allow_original\": true,\n    \"allow_original_accs\": false,\n    \"allow_cartesia\": true,\n    \"max_cartesia_clones\": 5,\n    \"sort_order\": 0\n  },\n  \"packages\": [\n    {\n      \"id\": 18342,\n      \"chars_granted\": 1000000,\n      \"chars_used\": 412870,\n      \"expires_at\": \"2026-11-09T12:04:51Z\",\n      \"tariff_code\": \"characters\",\n      \"source_type\": \"payment\",\n      \"created_at\": \"2026-10-10T12:04:51Z\",\n      \"remaining\": 587130\n    }\n  ]\n}"}],"notes":[],"section":"account","anchor":"#billing-me"},{"id":"billing-stats","method":"GET","path":"/v2/billing/stats","title":"Сводка: баланс, задачи, клоны","summary":"Баланс лицензии, счётчики задач и использованная квота клонов Cartesia одним запросом.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"subscription_type","type":"string","description":"`characters`, `unlimited` или `no_subscription`"},{"name":"subscription_expires_at","type":"datetime | null","description":"Конец безлимитной подписки"},{"name":"subscription_active","type":"boolean","description":"Можно ли сейчас ставить задачи (подписка и баланс)"},{"name":"total_characters","type":"integer","description":"Начислено в действующих пакетах"},{"name":"used_characters","type":"integer","description":"Списано из действующих пакетов"},{"name":"remaining_characters","type":"integer","description":"Остаток"},{"name":"tariff","type":"object | null","description":"Лимиты тарифа, как в /v2/billing/tariffs"},{"name":"packages","type":"array","description":"Действующие пакеты с остатком в порядке списания, у каждого свой срок"},{"name":"total_tasks","type":"integer","description":"Всего задач"},{"name":"completed_tasks","type":"integer","description":"Завершённых"},{"name":"active_tasks","type":"integer","description":"В очереди или в работе сейчас"},{"name":"clones_used","type":"integer","description":"Своих клонов Cartesia (идут в квоту)"},{"name":"clones_limit","type":"integer | null","description":"Квота клонов, `null` без лимита"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":null,"when":"Пользователь токена не найден"}],"examples":[{"title":"Сводка","curl":"curl \"https://voicer.mat3u.com/v2/billing/stats\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/billing/stats\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"user_id\": \"3f6c2a9e-8d41-4b7a-9c55-1e2f0a7d4b13\",\n  \"subscription_type\": \"characters\",\n  \"subscription_expires_at\": null,\n  \"subscription_active\": true,\n  \"total_characters\": 1000000,\n  \"used_characters\": 412870,\n  \"remaining_characters\": 587130,\n  \"tariff_code\": \"characters\",\n  \"tariff\": {\n    \"code\": \"characters\",\n    \"name\": \"Characters\",\n    \"kind\": \"package\",\n    \"max_parallel_tasks\": 5,\n    \"threads_per_task\": 15,\n    \"max_chunks_per_task\": null,\n    \"max_chars_per_task\": 200000,\n    \"allow_original\": true,\n    \"allow_original_accs\": false,\n    \"allow_cartesia\": true,\n    \"max_cartesia_clones\": 5,\n    \"sort_order\": 0\n  },\n  \"total_tasks\": 214,\n  \"completed_tasks\": 203,\n  \"active_tasks\": 1,\n  \"clones_used\": 2,\n  \"clones_limit\": 5,\n  \"packages\": [\n    {\n      \"id\": 18342,\n      \"chars_granted\": 1000000,\n      \"chars_used\": 412870,\n      \"expires_at\": \"2026-11-09T12:04:51Z\",\n      \"tariff_code\": \"characters\",\n      \"source_type\": \"payment\",\n      \"created_at\": \"2026-10-10T12:04:51Z\",\n      \"remaining\": 587130\n    }\n  ]\n}"}],"notes":[],"section":"account","anchor":"#billing-stats"},{"id":"billing-tariffs","method":"GET","path":"/v2/billing/tariffs","title":"Тарифы","summary":"Действующие тарифы и их лимиты. Покупка пакетов и подписок в Telegram-боте.","auth":"none","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"code","type":"string","description":"Код тарифа"},{"name":"kind","type":"string","description":"`package` (пакет символов) или `subscription` (подписка)"},{"name":"max_parallel_tasks","type":"integer","description":"Одновременных задач на лицензию"},{"name":"threads_per_task","type":"integer","description":"Параллельных потоков озвучки одной задачи"},{"name":"max_chunks_per_task","type":"integer | null","description":"Лимит чанков в задаче"},{"name":"max_chars_per_task","type":"integer | null","description":"Лимит символов в задаче"},{"name":"allow_original","type":"boolean","description":"Разрешён движок `original` (ElevenLabs)"},{"name":"allow_cartesia","type":"boolean","description":"Разрешён движок `cartesia`"},{"name":"max_cartesia_clones","type":"integer | null","description":"Квота своих клонов: `0` запрещены, `null` без лимита"}],"errors":[],"examples":[{"title":"Список тарифов","curl":"curl \"https://voicer.mat3u.com/v2/billing/tariffs\"","python":"r = requests.get(f\"{BASE}/v2/billing/tariffs\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"[\n  {\n    \"code\": \"characters\",\n    \"name\": \"Characters\",\n    \"kind\": \"package\",\n    \"max_parallel_tasks\": 5,\n    \"threads_per_task\": 15,\n    \"max_chunks_per_task\": null,\n    \"max_chars_per_task\": 200000,\n    \"allow_original\": true,\n    \"allow_original_accs\": false,\n    \"allow_cartesia\": true,\n    \"max_cartesia_clones\": 5,\n    \"sort_order\": 0\n  }\n]"}],"notes":[],"section":"account","anchor":"#billing-tariffs"},{"id":"voices-elevenlabs","method":"GET","path":"/v2/voices/elevenlabs","title":"Стандартные голоса ElevenLabs","summary":"Голоса, которые принимает задача с `engine=original`. Список статичный, отсортирован по имени.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"[].voice_id","type":"string","description":"Значение для `voice_id` задачи"},{"name":"[].name","type":"string","description":"Имя голоса"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"}],"examples":[{"title":"Список","curl":"curl \"https://voicer.mat3u.com/v2/voices/elevenlabs\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/voices/elevenlabs\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"[\n  {\n    \"voice_id\": \"pNInz6obpgDQGcFmaJgB\",\n    \"name\": \"Adam\"\n  },\n  {\n    \"voice_id\": \"Xb7hH8MSUJpSbSDYk0k2\",\n    \"name\": \"Alice\"\n  }\n]"}],"notes":[],"section":"voices","anchor":"#voices-elevenlabs"},{"id":"voices-elevenlabs-search","method":"GET","path":"/v2/voices/elevenlabs/search","title":"Поиск в библиотеке ElevenLabs","summary":"Бесплатные голоса публичной библиотеки ElevenLabs по имени, описанию или ID. Это источник для [клонирования в Cartesia](#cartesia-clone).","auth":"token","params":[{"name":"q","where":"query","type":"string","description":"Имя, описание или ID голоса. Если похоже на ID, голос с этим ID идёт первым","required":true,"default":null,"constraints":"1-100 символов, не только пробелы","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"query","type":"string","description":"Запрос как его понял сервер"},{"name":"items","type":"array","description":"Голоса: сначала найденный по ID, затем по имени"},{"name":"items[].voice_id","type":"string","description":"ID голоса ElevenLabs: подходит для клонирования"},{"name":"items[].name","type":"string","description":"Имя"},{"name":"items[].source","type":"string","description":"`account` найден по ID в аккаунте, `library` публичная библиотека"},{"name":"items[].language, accent, gender, age, use_case","type":"string | null","description":"Метки голоса"},{"name":"items[].preview_url","type":"string | null","description":"Публичный семпл ElevenLabs"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs не ответил, повторите позже"}],"examples":[{"title":"Поиск по имени","curl":"curl -G \"https://voicer.mat3u.com/v2/voices/elevenlabs/search\" \\\n  --data-urlencode \"q=Ярослав\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(\n    f\"{BASE}/v2/voices/elevenlabs/search\",\n    params={\n        \"q\": \"Ярослав\",\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"query\": \"Ярослав\",\n  \"items\": [\n    {\n      \"voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n      \"name\": \"Ярослав\",\n      \"source\": \"library\",\n      \"public_owner_id\": \"6d3c0e1b0f5a4c3f8a1e9b2d7c4f6a10\",\n      \"category\": \"high_quality\",\n      \"description\": \"Спокойный глубокий голос для озвучки роликов\",\n      \"language\": \"ru\",\n      \"accent\": \"standard\",\n      \"gender\": \"male\",\n      \"age\": \"middle_aged\",\n      \"use_case\": \"narrative_story\",\n      \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\"\n    }\n  ]\n}"}],"notes":["Голоса библиотеки нельзя напрямую передать в задачу с `engine=original`: сервис принимает только [стандартные голоса](#voices-elevenlabs). Чтобы озвучить библиотечным голосом, склонируйте его в Cartesia по `elevenlabs_voice_id`."],"section":"voices","anchor":"#voices-elevenlabs-search"},{"id":"voices-elevenlabs-featured","method":"GET","path":"/v2/voices/elevenlabs/featured","title":"Подборка русских голосов ElevenLabs","summary":"Бесплатные русскоязычные голоса библиотеки высокого качества, новые сверху. Ответ кэшируется на несколько минут.","auth":"token","params":[{"name":"page","where":"query","type":"integer","description":"Номер страницы с нуля","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Размер страницы","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Голоса, поля как в поиске"},{"name":"page, page_size","type":"integer","description":"Страница запроса"},{"name":"has_more","type":"boolean","description":"Есть следующая страница"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs не ответил, повторите позже"}],"examples":[{"title":"Первая страница по 10","curl":"curl -G \"https://voicer.mat3u.com/v2/voices/elevenlabs/featured\" \\\n  --data-urlencode \"page=0\" \\\n  --data-urlencode \"page_size=10\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(\n    f\"{BASE}/v2/voices/elevenlabs/featured\",\n    params={\n        \"page\": 0,\n        \"page_size\": 10,\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"items\": [\n    {\n      \"voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n      \"name\": \"Ярослав\",\n      \"source\": \"library\",\n      \"public_owner_id\": \"6d3c0e1b0f5a4c3f8a1e9b2d7c4f6a10\",\n      \"category\": \"high_quality\",\n      \"description\": \"Спокойный глубокий голос для озвучки роликов\",\n      \"language\": \"ru\",\n      \"accent\": \"standard\",\n      \"gender\": \"male\",\n      \"age\": \"middle_aged\",\n      \"use_case\": \"narrative_story\",\n      \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\"\n    }\n  ],\n  \"page\": 0,\n  \"page_size\": 10,\n  \"has_more\": true\n}"}],"notes":[],"section":"voices","anchor":"#voices-elevenlabs-featured"},{"id":"voices-models","method":"GET","path":"/v2/voices/models","title":"Модели","summary":"Допустимые `model_id` по движкам. Модель по умолчанию идёт первой и отмечена `default: true`.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"elevenlabs","type":"array","description":"Модели для `engine=original`"},{"name":"cartesia","type":"array","description":"Модели для `engine=cartesia`"},{"name":"*[].model_id","type":"string","description":"Значение для `model_id` задачи"},{"name":"*[].default","type":"boolean","description":"Модель по умолчанию"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"}],"examples":[{"title":"Модели","curl":"curl \"https://voicer.mat3u.com/v2/voices/models\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/voices/models\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"elevenlabs\": [\n    {\n      \"model_id\": \"eleven_multilingual_v2\",\n      \"default\": true\n    },\n    {\n      \"model_id\": \"eleven_v3\",\n      \"default\": false\n    }\n  ],\n  \"cartesia\": [\n    {\n      \"model_id\": \"sonic-3.6\",\n      \"default\": true\n    },\n    {\n      \"model_id\": \"sonic-3.5\",\n      \"default\": false\n    }\n  ]\n}"}],"notes":[],"section":"voices","anchor":"#voices-models"},{"id":"cartesia-voices","method":"GET","path":"/v2/voices/cartesia","title":"Свои клоны и общий каталог","summary":"Свои клоны и общий каталог клонов ElevenLabs одним списком.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Фильтр по языку: код Cartesia (`ru`, `de`, `uk`). Пусто: любой язык","required":false,"default":null,"constraints":"до 16 символов","values":[],"fields":[]},{"name":"source","where":"query","type":"string","description":"Только один источник; без параметра оба","required":false,"default":null,"constraints":null,"values":[{"value":"user","description":"Свои клоны"},{"value":"elevenlabs","description":"Общий каталог клонов голосов ElevenLabs"}],"fields":[]},{"name":"q","where":"query","type":"string","description":"Поиск по имени и ID","required":false,"default":null,"constraints":"до 100 символов","values":[],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Номер страницы с нуля","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Размер страницы","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Голоса, поля ниже"},{"name":"total","type":"integer","description":"Всего голосов под фильтром"},{"name":"page, page_size","type":"integer","description":"Страница запроса"},{"name":"has_more","type":"boolean","description":"Есть следующая страница"},{"name":"items[].voice_id","type":"string","description":"ID для `voice_id` задачи с `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Описание голоса"},{"name":"items[].language","type":"string | null","description":"Язык голоса; у клонов `ru` или `en`"},{"name":"items[].accent","type":"string | null","description":"Акцент"},{"name":"items[].gender","type":"string | null","description":"Пол, только у стандартных голосов"},{"name":"items[].source","type":"string","description":"`standard` библиотека Cartesia, `elevenlabs` общий каталог клонов, `user` свой клон"},{"name":"items[].preview_url","type":"string | null","description":"Семпл для плеера без токена"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Исходный голос ElevenLabs у клона"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Исходный голос ElevenLabs платный"},{"name":"items[].is_owner","type":"boolean","description":"Это ваш клон"},{"name":"items[].created_at","type":"datetime | null","description":"Когда создан клон"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":402,"code":"subscription_required","when":"Нет подписки или символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":403,"code":"engine_not_allowed","when":"Тариф не разрешает движок cartesia"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"}],"examples":[{"title":"Русские голоса из обоих источников","curl":"curl -G \"https://voicer.mat3u.com/v2/voices/cartesia\" \\\n  --data-urlencode \"language=ru\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(\n    f\"{BASE}/v2/voices/cartesia\",\n    params={\n        \"language\": \"ru\",\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"items\": [\n    {\n      \"voice_id\": \"c41f7b20-95de-4a1b-8e33-7a6d2f0c9b85\",\n      \"name\": \"Мой голос\",\n      \"tagline\": null,\n      \"description\": null,\n      \"language\": \"ru\",\n      \"accent\": null,\n      \"gender\": null,\n      \"source\": \"user\",\n      \"preview_url\": null,\n      \"elevenlabs_voice_id\": null,\n      \"labs_is_paid\": null,\n      \"is_owner\": true,\n      \"created_at\": \"2026-10-11T10:02:11Z\"\n    },\n    {\n      \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n      \"name\": \"Ярослав\",\n      \"tagline\": null,\n      \"description\": \"Спокойный глубокий голос для озвучки роликов\",\n      \"language\": \"ru\",\n      \"accent\": null,\n      \"gender\": null,\n      \"source\": \"elevenlabs\",\n      \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\",\n      \"elevenlabs_voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n      \"labs_is_paid\": false,\n      \"is_owner\": false,\n      \"created_at\": \"2026-09-02T08:15:40Z\"\n    }\n  ],\n  \"total\": 2,\n  \"page\": 0,\n  \"page_size\": 50,\n  \"has_more\": false\n}"}],"notes":[],"section":"cartesia","anchor":"#cartesia-voices"},{"id":"cartesia-catalog","method":"GET","path":"/v2/voices/cartesia/catalog","title":"Общий каталог клонов","summary":"Клоны голосов ElevenLabs, доступные всем пользователям. Ими можно озвучивать без своих слотов клонов.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Фильтр по языку: код Cartesia (`ru`, `de`, `uk`). Пусто: любой язык","required":false,"default":null,"constraints":"до 16 символов","values":[],"fields":[]},{"name":"paid","where":"query","type":"boolean","description":"Фильтр по исходному голосу ElevenLabs; без параметра все","required":false,"default":null,"constraints":null,"values":[{"value":"true","description":"Клоны платных голосов ElevenLabs"},{"value":"false","description":"Клоны бесплатных голосов"}],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Номер страницы с нуля","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Размер страницы","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Голоса, поля ниже"},{"name":"total","type":"integer","description":"Всего голосов под фильтром"},{"name":"page, page_size","type":"integer","description":"Страница запроса"},{"name":"has_more","type":"boolean","description":"Есть следующая страница"},{"name":"items[].voice_id","type":"string","description":"ID для `voice_id` задачи с `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Описание голоса"},{"name":"items[].language","type":"string | null","description":"Язык голоса; у клонов `ru` или `en`"},{"name":"items[].accent","type":"string | null","description":"Акцент"},{"name":"items[].gender","type":"string | null","description":"Пол, только у стандартных голосов"},{"name":"items[].source","type":"string","description":"`standard` библиотека Cartesia, `elevenlabs` общий каталог клонов, `user` свой клон"},{"name":"items[].preview_url","type":"string | null","description":"Семпл для плеера без токена"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Исходный голос ElevenLabs у клона"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Исходный голос ElevenLabs платный"},{"name":"items[].is_owner","type":"boolean","description":"Это ваш клон"},{"name":"items[].created_at","type":"datetime | null","description":"Когда создан клон"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":402,"code":"subscription_required","when":"Нет подписки или символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":403,"code":"engine_not_allowed","when":"Тариф не разрешает движок cartesia"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"}],"examples":[{"title":"Каталог на русском","curl":"curl -G \"https://voicer.mat3u.com/v2/voices/cartesia/catalog\" \\\n  --data-urlencode \"language=ru\" \\\n  --data-urlencode \"page=0\" \\\n  --data-urlencode \"page_size=50\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(\n    f\"{BASE}/v2/voices/cartesia/catalog\",\n    params={\n        \"language\": \"ru\",\n        \"page\": 0,\n        \"page_size\": 50,\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"items\": [\n    {\n      \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n      \"name\": \"Ярослав\",\n      \"tagline\": null,\n      \"description\": \"Спокойный глубокий голос для озвучки роликов\",\n      \"language\": \"ru\",\n      \"accent\": null,\n      \"gender\": null,\n      \"source\": \"elevenlabs\",\n      \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\",\n      \"elevenlabs_voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n      \"labs_is_paid\": false,\n      \"is_owner\": false,\n      \"created_at\": \"2026-09-02T08:15:40Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 0,\n  \"page_size\": 50,\n  \"has_more\": false\n}"}],"notes":[],"section":"cartesia","anchor":"#cartesia-catalog"},{"id":"cartesia-mine","method":"GET","path":"/v2/voices/cartesia/mine","title":"Мои клоны и квота","summary":"Только свои клоны и сколько слотов клонов занято.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Фильтр по языку: код Cartesia (`ru`, `de`, `uk`). Пусто: любой язык","required":false,"default":null,"constraints":"до 16 символов","values":[],"fields":[]},{"name":"q","where":"query","type":"string","description":"Поиск по имени и ID","required":false,"default":null,"constraints":"до 100 символов","values":[],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Номер страницы с нуля","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Размер страницы","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Голоса, поля ниже"},{"name":"total","type":"integer","description":"Всего голосов под фильтром"},{"name":"page, page_size","type":"integer","description":"Страница запроса"},{"name":"has_more","type":"boolean","description":"Есть следующая страница"},{"name":"clones_used","type":"integer","description":"Своих клонов в любом статусе (идут в квоту)"},{"name":"clones_limit","type":"integer | null","description":"Квота тарифа: `null` без лимита, `0` запрещены"},{"name":"items[].voice_id","type":"string","description":"ID для `voice_id` задачи с `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Описание голоса"},{"name":"items[].language","type":"string | null","description":"Язык голоса; у клонов `ru` или `en`"},{"name":"items[].accent","type":"string | null","description":"Акцент"},{"name":"items[].gender","type":"string | null","description":"Пол, только у стандартных голосов"},{"name":"items[].source","type":"string","description":"`standard` библиотека Cartesia, `elevenlabs` общий каталог клонов, `user` свой клон"},{"name":"items[].preview_url","type":"string | null","description":"Семпл для плеера без токена"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Исходный голос ElevenLabs у клона"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Исходный голос ElevenLabs платный"},{"name":"items[].is_owner","type":"boolean","description":"Это ваш клон"},{"name":"items[].created_at","type":"datetime | null","description":"Когда создан клон"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":402,"code":"subscription_required","when":"Нет подписки или символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":403,"code":"engine_not_allowed","when":"Тариф не разрешает движок cartesia"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"}],"examples":[{"title":"Мои клоны","curl":"curl \"https://voicer.mat3u.com/v2/voices/cartesia/mine\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/voices/cartesia/mine\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"items\": [\n    {\n      \"voice_id\": \"c41f7b20-95de-4a1b-8e33-7a6d2f0c9b85\",\n      \"name\": \"Мой голос\",\n      \"tagline\": null,\n      \"description\": null,\n      \"language\": \"ru\",\n      \"accent\": null,\n      \"gender\": null,\n      \"source\": \"user\",\n      \"preview_url\": null,\n      \"elevenlabs_voice_id\": null,\n      \"labs_is_paid\": null,\n      \"is_owner\": true,\n      \"created_at\": \"2026-10-11T10:02:11Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 0,\n  \"page_size\": 50,\n  \"has_more\": false,\n  \"clones_used\": 1,\n  \"clones_limit\": 5\n}"}],"notes":[],"section":"cartesia","anchor":"#cartesia-mine"},{"id":"cartesia-standard","method":"GET","path":"/v2/voices/cartesia/standard","title":"Стандартные голоса Cartesia","summary":"Библиотека готовых голосов Cartesia. Слоты клонов не нужны.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Фильтр по языку: код Cartesia (`ru`, `de`, `uk`). Пусто: любой язык","required":false,"default":null,"constraints":"до 16 символов","values":[],"fields":[]},{"name":"gender","where":"query","type":"string","description":"Фильтр по полу","required":false,"default":null,"constraints":null,"values":[{"value":"masculine","description":"Мужские"},{"value":"feminine","description":"Женские"},{"value":"gender_neutral","description":"Нейтральные"}],"fields":[]},{"name":"q","where":"query","type":"string","description":"Поиск по имени и описанию","required":false,"default":null,"constraints":"до 100 символов","values":[],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Номер страницы с нуля","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Размер страницы","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Голоса, поля ниже"},{"name":"total","type":"integer","description":"Всего голосов под фильтром"},{"name":"page, page_size","type":"integer","description":"Страница запроса"},{"name":"has_more","type":"boolean","description":"Есть следующая страница"},{"name":"items[].voice_id","type":"string","description":"ID для `voice_id` задачи с `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Описание голоса"},{"name":"items[].language","type":"string | null","description":"Язык голоса; у клонов `ru` или `en`"},{"name":"items[].accent","type":"string | null","description":"Акцент"},{"name":"items[].gender","type":"string | null","description":"Пол, только у стандартных голосов"},{"name":"items[].source","type":"string","description":"`standard` библиотека Cartesia, `elevenlabs` общий каталог клонов, `user` свой клон"},{"name":"items[].preview_url","type":"string | null","description":"Семпл для плеера без токена"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Исходный голос ElevenLabs у клона"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Исходный голос ElevenLabs платный"},{"name":"items[].is_owner","type":"boolean","description":"Это ваш клон"},{"name":"items[].created_at","type":"datetime | null","description":"Когда создан клон"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":402,"code":"subscription_required","when":"Нет подписки или символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":403,"code":"engine_not_allowed","when":"Тариф не разрешает движок cartesia"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"}],"examples":[{"title":"Женские русские голоса","curl":"curl -G \"https://voicer.mat3u.com/v2/voices/cartesia/standard\" \\\n  --data-urlencode \"language=ru\" \\\n  --data-urlencode \"gender=feminine\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(\n    f\"{BASE}/v2/voices/cartesia/standard\",\n    params={\n        \"language\": \"ru\",\n        \"gender\": \"feminine\",\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"items\": [\n    {\n      \"voice_id\": \"f786b574-daa5-4673-aa0c-cbe3e8534c02\",\n      \"name\": \"Анна\",\n      \"tagline\": \"Тёплый дикторский голос\",\n      \"description\": \"Ровная подача для новостей и обучающих видео\",\n      \"language\": \"ru\",\n      \"accent\": null,\n      \"gender\": \"feminine\",\n      \"source\": \"standard\",\n      \"preview_url\": \"https://voicer.mat3u.com/v2/voices/cartesia/standard/f786b574-daa5-4673-aa0c-cbe3e8534c02/preview\",\n      \"elevenlabs_voice_id\": null,\n      \"labs_is_paid\": null,\n      \"is_owner\": false,\n      \"created_at\": null\n    }\n  ],\n  \"total\": 1,\n  \"page\": 0,\n  \"page_size\": 50,\n  \"has_more\": false\n}"}],"notes":[],"section":"cartesia","anchor":"#cartesia-standard"},{"id":"cartesia-voice","method":"GET","path":"/v2/voices/cartesia/{voice_id}","title":"Карточка голоса Cartesia","summary":"Свой клон, клон из общего каталога или стандартный голос по ID.","auth":"token","params":[{"name":"voice_id","where":"path","type":"string","description":"ID голоса","required":true,"default":null,"constraints":"1-64","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"voice_id","type":"string","description":"ID для `voice_id` задачи с `engine=cartesia`"},{"name":"name, tagline, description","type":"string | null","description":"Описание голоса"},{"name":"language","type":"string | null","description":"Язык голоса; у клонов `ru` или `en`"},{"name":"accent","type":"string | null","description":"Акцент"},{"name":"gender","type":"string | null","description":"Пол, только у стандартных голосов"},{"name":"source","type":"string","description":"`standard` библиотека Cartesia, `elevenlabs` общий каталог клонов, `user` свой клон"},{"name":"preview_url","type":"string | null","description":"Семпл для плеера без токена"},{"name":"elevenlabs_voice_id","type":"string | null","description":"Исходный голос ElevenLabs у клона"},{"name":"labs_is_paid","type":"boolean | null","description":"Исходный голос ElevenLabs платный"},{"name":"is_owner","type":"boolean","description":"Это ваш клон"},{"name":"created_at","type":"datetime | null","description":"Когда создан клон"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":402,"code":"subscription_required","when":"Нет подписки или символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":403,"code":"engine_not_allowed","when":"Тариф не разрешает движок cartesia"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":404,"code":"voice_not_found","when":"Голоса нет или это чужой клон"}],"examples":[{"title":"Клон из каталога","curl":"curl \"https://voicer.mat3u.com/v2/voices/cartesia/8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"voice_id = \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\"\nr = s.get(f\"{BASE}/v2/voices/cartesia/{voice_id}\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n  \"name\": \"Ярослав\",\n  \"tagline\": null,\n  \"description\": \"Спокойный глубокий голос для озвучки роликов\",\n  \"language\": \"ru\",\n  \"accent\": null,\n  \"gender\": null,\n  \"source\": \"elevenlabs\",\n  \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\",\n  \"elevenlabs_voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n  \"labs_is_paid\": false,\n  \"is_owner\": false,\n  \"created_at\": \"2026-09-02T08:15:40Z\"\n}"}],"notes":[],"section":"cartesia","anchor":"#cartesia-voice"},{"id":"cartesia-preview","method":"GET","path":"/v2/voices/cartesia/standard/{voice_id}/preview","title":"Семпл стандартного голоса","summary":"MP3-семпл стандартного голоса Cartesia. Ссылку `preview_url` из каталога можно ставить в `<audio>` как есть: токен не нужен, ответ кэшируется на 7 дней и открыт для CORS.","auth":"none","params":[{"name":"voice_id","where":"path","type":"string","description":"ID стандартного голоса (UUID)","required":true,"default":null,"constraints":null,"values":[],"fields":[]}],"content_type":null,"response_type":"audio/mpeg","response":[],"errors":[{"status":404,"code":"preview_not_found","when":"У голоса нет семпла"},{"status":502,"code":"cartesia_unavailable","when":"Cartesia не ответила или отказала"},{"status":503,"code":"no_account_available","when":"Нет рабочего аккаунта Cartesia, повторите позже"}],"examples":[{"title":"Скачать семпл","curl":"curl \"https://voicer.mat3u.com/v2/voices/cartesia/standard/f786b574-daa5-4673-aa0c-cbe3e8534c02/preview\" \\\n  -o preview.mp3","python":"voice_id = \"f786b574-daa5-4673-aa0c-cbe3e8534c02\"\nwith requests.get(\n    f\"{BASE}/v2/voices/cartesia/standard/{voice_id}/preview\",\n    stream=True,\n    timeout=30,\n) as r:\n    r.raise_for_status()\n    with open(\"preview.mp3\", \"wb\") as f:\n        for piece in r.iter_content(1 << 16):\n            f.write(piece)","status":200,"response":"MP3 (audio/mpeg)"}],"notes":[],"section":"cartesia","anchor":"#cartesia-preview"},{"id":"cartesia-clone","method":"POST","path":"/v2/voices/cartesia/clone","title":"Клонировать голос","summary":"Создаёт клон Cartesia из своего аудио или из голоса ElevenLabs. Запрос синхронный и может идти до нескольких минут: ставьте таймаут клиента от 300 секунд.","auth":"token","params":[{"name":"language","where":"form","type":"string","description":"Язык голоса. Славянские (`ru`, `uk`, `be`, `pl`, `cs`, `bg`, `sr` и др.) дают ru-клон, остальные en-клон","required":true,"default":null,"constraints":"до 16 символов","values":[],"fields":[]},{"name":"clip","where":"form","type":"file","description":"Аудио с речью. Обязателен без `elevenlabs_voice_id`; с ним необязателен (тогда берётся семпл голоса ElevenLabs)","required":false,"default":null,"constraints":"10-60 секунд, до 16 МБ; flac, mp3, mpeg, mpga, oga, ogg, wav, webm","values":[],"fields":[]},{"name":"elevenlabs_voice_id","where":"form","type":"string","description":"Голос ElevenLabs. С ним клон попадает в общий каталог и не тратит ваш слот","required":false,"default":null,"constraints":"10-64 латинских букв и цифр","values":[],"fields":[]},{"name":"name","where":"form","type":"string","description":"Имя клона. По умолчанию имя голоса ElevenLabs или `clone-ru`/`clone-en`","required":false,"default":null,"constraints":"до 255 символов","values":[],"fields":[]},{"name":"mode","where":"form","type":"string","description":"Режим клонирования Cartesia","required":false,"default":"\"similarity\"","constraints":null,"values":[{"value":"similarity","description":"Максимально похоже на исходник"},{"value":"stability","description":"Стабильнее звучание, меньше артефактов исходника"}],"fields":[]},{"name":"tagline","where":"form","type":"string","description":"Короткая подпись","required":false,"default":null,"constraints":"до 32 символов","values":[],"fields":[]},{"name":"description","where":"form","type":"string","description":"Описание. По умолчанию описание голоса ElevenLabs","required":false,"default":null,"constraints":"до 1000 символов","values":[],"fields":[]},{"name":"accent","where":"form","type":"string","description":"Акцент","required":false,"default":null,"constraints":"до 64 символов","values":[],"fields":[]}],"content_type":"multipart/form-data","response_type":"application/json","response":[{"name":"voice","type":"object","description":"Клон, поля как в карточке голоса"},{"name":"reused","type":"boolean","description":"`true`: готовый клон этого голоса уже был в каталоге"},{"name":"clones_used","type":"integer","description":"Своих клонов после операции"},{"name":"clones_limit","type":"integer | null","description":"Квота своих клонов, `null` без лимита"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":402,"code":"subscription_required","when":"Нет подписки или символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":403,"code":"engine_not_allowed","when":"Тариф не разрешает движок cartesia"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":403,"code":"clone_limit_reached","when":"Заняты все слоты своих клонов"},{"status":413,"code":"clip_too_large","when":"Файл больше 16 МБ"},{"status":415,"code":"unsupported_format","when":"Формат файла не поддерживается"},{"status":422,"code":"clip_required","when":"Нет ни `clip`, ни `elevenlabs_voice_id`"},{"status":422,"code":"invalid_duration","when":"Длина аудио не 10-60 секунд"},{"status":422,"code":"invalid_audio","when":"Файл не читается как аудио"},{"status":422,"code":"empty_clip","when":"Пустой файл"},{"status":422,"code":"elevenlabs_voice_not_found","when":"Голоса нет в ElevenLabs"},{"status":422,"code":"cartesia_rejected","when":"Cartesia отклонила клип"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs не ответил"},{"status":502,"code":"cartesia_unavailable","when":"Cartesia не ответила или отказала"},{"status":503,"code":"no_account_available","when":"Нет рабочего аккаунта Cartesia, повторите позже"}],"examples":[{"title":"Свой клон из файла (занимает слот)","curl":"curl -X POST \"https://voicer.mat3u.com/v2/voices/cartesia/clone\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -F \"language=ru\" \\\n  -F \"name=Мой голос\" \\\n  -F \"clip=@voice.wav\"","python":"r = s.post(\n    f\"{BASE}/v2/voices/cartesia/clone\",\n    data={\n        \"language\": \"ru\",\n        \"name\": \"Мой голос\",\n    },\n    files={\"clip\": open(\"voice.wav\", \"rb\")},\n    timeout=300,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"voice\": {\n    \"voice_id\": \"c41f7b20-95de-4a1b-8e33-7a6d2f0c9b85\",\n    \"name\": \"Мой голос\",\n    \"tagline\": null,\n    \"description\": null,\n    \"language\": \"ru\",\n    \"accent\": null,\n    \"gender\": null,\n    \"source\": \"user\",\n    \"preview_url\": null,\n    \"elevenlabs_voice_id\": null,\n    \"labs_is_paid\": null,\n    \"is_owner\": true,\n    \"created_at\": \"2026-10-11T10:02:11Z\"\n  },\n  \"reused\": false,\n  \"clones_used\": 2,\n  \"clones_limit\": 5\n}"},{"title":"Клон голоса ElevenLabs (слот не тратит)","curl":"curl -X POST \"https://voicer.mat3u.com/v2/voices/cartesia/clone\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -F \"language=ru\" \\\n  -F \"elevenlabs_voice_id=Wu3B7bOkdHbKnJTvbiFk\"","python":"r = s.post(\n    f\"{BASE}/v2/voices/cartesia/clone\",\n    data={\n        \"language\": \"ru\",\n        \"elevenlabs_voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n    },\n    timeout=300,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"voice\": {\n    \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n    \"name\": \"Ярослав\",\n    \"tagline\": null,\n    \"description\": \"Спокойный глубокий голос для озвучки роликов\",\n    \"language\": \"ru\",\n    \"accent\": null,\n    \"gender\": null,\n    \"source\": \"elevenlabs\",\n    \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\",\n    \"elevenlabs_voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n    \"labs_is_paid\": false,\n    \"is_owner\": false,\n    \"created_at\": \"2026-09-02T08:15:40Z\"\n  },\n  \"reused\": true,\n  \"clones_used\": 1,\n  \"clones_limit\": 5\n}"}],"notes":["Повторный клон того же голоса ElevenLabs на том же языке не создаётся: сразу возвращается готовый клон с `reused: true`. Проверить заранее можно через [/from-labs](#cartesia-from-labs)."],"section":"cloning","anchor":"#cartesia-clone"},{"id":"cartesia-from-labs","method":"GET","path":"/v2/voices/cartesia/from-labs/{voice_id}","title":"Проверить голос ElevenLabs перед клоном","summary":"Есть ли голос в ElevenLabs, есть ли уже его клон в общем каталоге и у вас. Ничего не создаёт.","auth":"token","params":[{"name":"voice_id","where":"path","type":"string","description":"ID голоса ElevenLabs","required":true,"default":null,"constraints":"10-64 латинских букв и цифр","values":[],"fields":[]},{"name":"language","where":"query","type":"string","description":"Язык клона: `ru` или `en` (как у /clone); пусто: клон на любом языке","required":false,"default":null,"constraints":"до 16 символов","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"elevenlabs_voice_id","type":"string","description":"ID голоса ElevenLabs"},{"name":"name","type":"string | null","description":"Имя"},{"name":"preview_url","type":"string | null","description":"Семпл ElevenLabs"},{"name":"labs_is_paid","type":"boolean | null","description":"Голос платный в ElevenLabs"},{"name":"clone_language","type":"string | null","description":"Код языка клона или `null`"},{"name":"can_clone","type":"boolean","description":"Клона в общем каталоге ещё нет"},{"name":"catalog","type":"object | null","description":"Готовый клон в общем каталоге"},{"name":"mine","type":"object | null","description":"Ваш клон этого голоса"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":402,"code":"subscription_required","when":"Нет подписки или символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":403,"code":"engine_not_allowed","when":"Тариф не разрешает движок cartesia"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":404,"code":"elevenlabs_voice_not_found","when":"Голоса нет в ElevenLabs"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs не ответил"}],"examples":[{"title":"Клон уже есть в каталоге","curl":"curl -G \"https://voicer.mat3u.com/v2/voices/cartesia/from-labs/Wu3B7bOkdHbKnJTvbiFk\" \\\n  --data-urlencode \"language=ru\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"voice_id = \"Wu3B7bOkdHbKnJTvbiFk\"\nr = s.get(\n    f\"{BASE}/v2/voices/cartesia/from-labs/{voice_id}\",\n    params={\n        \"language\": \"ru\",\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"elevenlabs_voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n  \"name\": \"Ярослав\",\n  \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\",\n  \"labs_is_paid\": false,\n  \"clone_language\": \"ru\",\n  \"can_clone\": false,\n  \"catalog\": {\n    \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n    \"name\": \"Ярослав\",\n    \"tagline\": null,\n    \"description\": \"Спокойный глубокий голос для озвучки роликов\",\n    \"language\": \"ru\",\n    \"accent\": null,\n    \"gender\": null,\n    \"source\": \"elevenlabs\",\n    \"preview_url\": \"https://storage.googleapis.com/eleven-public-prod/previews/Wu3B7.mp3\",\n    \"elevenlabs_voice_id\": \"Wu3B7bOkdHbKnJTvbiFk\",\n    \"labs_is_paid\": false,\n    \"is_owner\": false,\n    \"created_at\": \"2026-09-02T08:15:40Z\"\n  },\n  \"mine\": null\n}"}],"notes":[],"section":"cloning","anchor":"#cartesia-from-labs"},{"id":"cartesia-delete","method":"DELETE","path":"/v2/voices/cartesia/{voice_id}","title":"Удалить свой клон","summary":"Удаляет клон в Cartesia и освобождает слот. Клоны общего каталога удалить нельзя.","auth":"token","params":[{"name":"voice_id","where":"path","type":"string","description":"ID своего клона","required":true,"default":null,"constraints":"1-64","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"voice_id","type":"string","description":"Удалённый клон"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":403,"code":"shared_clone","when":"Это клон общего каталога"},{"status":404,"code":"voice_not_found","when":"Клона нет или он чужой"},{"status":502,"code":"cartesia_unavailable","when":"Cartesia не ответила или отказала"},{"status":503,"code":"no_account_available","when":"Нет рабочего аккаунта Cartesia, повторите позже"}],"examples":[{"title":"Удалить","curl":"curl -X DELETE \"https://voicer.mat3u.com/v2/voices/cartesia/c41f7b20-95de-4a1b-8e33-7a6d2f0c9b85\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"voice_id = \"c41f7b20-95de-4a1b-8e33-7a6d2f0c9b85\"\nr = s.delete(f\"{BASE}/v2/voices/cartesia/{voice_id}\", timeout=30)\nr.raise_for_status()\nprint(r.status_code)","status":200,"response":"{\n  \"voice_id\": \"c41f7b20-95de-4a1b-8e33-7a6d2f0c9b85\"\n}"}],"notes":[],"section":"cloning","anchor":"#cartesia-delete"},{"id":"tasks-create","method":"POST","path":"/v2/tasks","title":"Создать задачу озвучки","summary":"Ставит текст в очередь и сразу списывает символы. Отвечает `202` с `task_id`; результат ждите через [GET /v2/tasks/{task_id}](#tasks-get).","auth":"token","params":[{"name":"text","where":"body","type":"string","description":"Текст для озвучки. Длина в символах и есть стоимость задачи","required":true,"default":null,"constraints":"1-1 000 000 символов и не больше `max_chars_per_task` тарифа","values":[],"fields":[]},{"name":"voice_id","where":"body","type":"string","description":"Голос. Для `original` ID стандартного голоса ElevenLabs; для `cartesia` ID клона, стандартного голоса Cartesia или голоса ElevenLabs, у которого есть клон","required":true,"default":null,"constraints":"1-50 символов","values":[],"fields":[]},{"name":"engine","where":"body","type":"string","description":"Движок. Не указан: `original`, если тариф его разрешает, иначе `cartesia`","required":false,"default":null,"constraints":null,"values":[{"value":"original","description":"ElevenLabs"},{"value":"cartesia","description":"Cartesia"}],"fields":[]},{"name":"model_id","where":"body","type":"string","description":"Модель. Не указана: `eleven_multilingual_v2` или `sonic-3.6`. Список в [/v2/voices/models](#voices-models)","required":false,"default":null,"constraints":"до 50 символов","values":[],"fields":[]},{"name":"language","where":"body","type":"string","description":"Язык текста, только для `cartesia`: выбирает клон этого языка и язык синтеза. Не указан: язык голоса","required":false,"default":null,"constraints":"до 16 символов, например `ru`, `en`, `de`","values":[],"fields":[]},{"name":"dub_languages","where":"body","type":"array","description":"Дубляж: языки, на которые переводится текст. Каждый язык озвучивается отдельной дорожкой; чанки всех дорожек дополняются тишиной до самого длинного, поэтому файлы совпадают с оригиналом по длине. Голос по умолчанию как у оригинала (Cartesia берёт клон на языке дорожки). Другой голос на язык задаётся в `dub_voices`. Стоимость: текст × (1 + 1.5 × число языков)","required":false,"default":null,"constraints":"коды из каталога движка, например `en`, `de`, `es`; повторы отбрасываются","values":[],"fields":[]},{"name":"dub_voices","where":"body","type":"object","description":"Голос дорожки: объект `{код языка: voice_id}`. Например `{\"en\": \"pNInz6obpgDQGcFmaJgB\", \"de\": \"EXAVITQu4vr4xnSDxMaL\"}`: английский и немецкий своими голосами. Ключ должен быть из `dub_languages`. Нет ключа: Labs озвучивает тем же голосом, что оригинал, Cartesia берёт клон на языке дорожки","required":false,"default":null,"constraints":"те же `voice_id`, что в задаче; ключ вне `dub_languages` даёт `400 unknown_dub_voice`","values":[],"fields":[]},{"name":"voice_settings","where":"body","type":"object","description":"Настройки голоса ElevenLabs. Cartesia их игнорирует. Неуказанные поля берутся по умолчанию у ElevenLabs","required":false,"default":null,"constraints":null,"values":[],"fields":[{"name":"stability","where":"body","type":"number","description":"Стабильность интонации","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]},{"name":"similarity_boost","where":"body","type":"number","description":"Похожесть на исходный голос","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]},{"name":"style","where":"body","type":"number","description":"Выразительность стиля","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]},{"name":"use_speaker_boost","where":"body","type":"boolean","description":"Усиление сходства с диктором","required":false,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"speed","where":"body","type":"number","description":"Скорость речи","required":false,"default":null,"constraints":"0.7-1.2","values":[],"fields":[]}]},{"name":"split_type","where":"body","type":"string","description":"Как резать текст на чанки","required":false,"default":"\"smart\"","constraints":null,"values":[{"value":"smart","description":"По предложениям, склеенным до `max_chunk_length`; кавычки и прямая речь не разрываются"},{"value":"paragraphs","description":"Каждая непустая строка отдельным чанком; `max_chunk_length` не действует, строка длиннее 2500 символов даёт `400 invalid_split`"},{"value":"max_length","description":"По предложениям до `max_chunk_length`, без учёта кавычек"}],"fields":[]},{"name":"max_chunk_length","where":"body","type":"integer","description":"Максимальная длина чанка. Для `cartesia` (кроме `paragraphs`) и для китайского, японского и корейского текста урезается до 500","required":false,"default":"1000","constraints":"500-2500","values":[],"fields":[]},{"name":"split_output","where":"body","type":"boolean","description":"`true`: результат ZIP с отдельным MP3 на каждый чанк вместо одного MP3","required":false,"default":"false","constraints":null,"values":[],"fields":[]},{"name":"auto_pause","where":"body","type":"object","description":"Тишина после каждого `frequency`-го чанка. После последнего чанка паузы нет","required":false,"default":null,"constraints":null,"values":[],"fields":[{"name":"enabled","where":"body","type":"boolean","description":"Включить паузы","required":false,"default":"false","constraints":null,"values":[],"fields":[]},{"name":"duration","where":"body","type":"number","description":"Длина паузы в секундах","required":false,"default":"0.5","constraints":"0.1-30","values":[],"fields":[]},{"name":"frequency","where":"body","type":"integer","description":"Пауза после каждого N-го чанка","required":false,"default":"1","constraints":"1-100","values":[],"fields":[]}]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"task_id","type":"string","description":"ID задачи"},{"name":"status","type":"string","description":"Всегда `pending`"},{"name":"engine","type":"string","description":"Выбранный движок"},{"name":"voice_id","type":"string","description":"Голос, который получит провайдер (у Cartesia ID клона)"},{"name":"model_id","type":"string","description":"Выбранная модель"},{"name":"chunks_count","type":"integer","description":"На сколько чанков разрезан текст"},{"name":"characters","type":"integer","description":"Длина текста"},{"name":"charged_characters","type":"integer","description":"Списано символов; `0` на безлимите"},{"name":"dubs","type":"array | null","description":"С `dub_languages`: `[{language, task_id, status, progress_percent, voice_id}]`, у каждой дорожки свой `task_id` для статуса и скачивания"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":400,"code":"empty_text","when":"В тексте нет ничего, что можно озвучить"},{"status":400,"code":"text_too_long","when":"Текст длиннее `max_chars_per_task` тарифа"},{"status":400,"code":"too_many_chunks","when":"Чанков больше `max_chunks_per_task` тарифа"},{"status":400,"code":"invalid_split","when":"Нарезка невозможна (длинный абзац в `paragraphs`)"},{"status":400,"code":"voice_not_found","when":"Голос не найден для этого движка"},{"status":400,"code":"voice_not_allowed","when":"Голос ElevenLabs вне списка стандартных"},{"status":400,"code":"invalid_model","when":"Модель не поддерживается или снята"},{"status":400,"code":"unsupported_dub_language","when":"Язык дубляжа недоступен движку или модели (`unsupported`, `available`)"},{"status":400,"code":"dub_same_language","when":"Язык дубляжа совпадает с `language` текста"},{"status":400,"code":"unknown_dub_voice","when":"В `dub_voices` язык, которого нет в `dub_languages`"},{"status":402,"code":"subscription_required","when":"Нет подписки или пакета символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":402,"code":"insufficient_characters","when":"Не хватает символов (`required`, `available`)"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":403,"code":"engine_not_allowed","when":"Движок закрыт тарифом"},{"status":429,"code":"too_many_active_tasks","when":"Достигнут `max_parallel_tasks` лицензии"},{"status":503,"code":"queue_unavailable","when":"Очередь недоступна, символы возвращены"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs недоступен для проверки голоса"},{"status":503,"code":"maintenance","when":"Технические работы, новые задачи не принимаются"}],"examples":[{"title":"ElevenLabs, минимальный запрос","curl":"curl -X POST \"https://voicer.mat3u.com/v2/tasks\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"text\": \"Привет! Это тест Voicer API.\",\n  \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\"\n}'","python":"r = s.post(\n    f\"{BASE}/v2/tasks\",\n    json={\n        \"text\": \"Привет! Это тест Voicer API.\",\n        \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\",\n    },\n    timeout=60,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"engine\": \"original\",\n  \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\",\n  \"model_id\": \"eleven_multilingual_v2\",\n  \"chunks_count\": 1,\n  \"characters\": 28,\n  \"charged_characters\": 28\n}"},{"title":"ElevenLabs со всеми настройками","curl":"curl -X POST \"https://voicer.mat3u.com/v2/tasks\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"text\": \"Глава первая.\\nУтро началось с дождя.\\nГлава вторая.\",\n  \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\",\n  \"engine\": \"original\",\n  \"model_id\": \"eleven_v3\",\n  \"voice_settings\": {\n    \"stability\": 0.45,\n    \"similarity_boost\": 0.8,\n    \"style\": 0.2,\n    \"use_speaker_boost\": true,\n    \"speed\": 1.05\n  },\n  \"split_type\": \"paragraphs\",\n  \"split_output\": false,\n  \"auto_pause\": {\n    \"enabled\": true,\n    \"duration\": 1.2,\n    \"frequency\": 1\n  }\n}'","python":"r = s.post(\n    f\"{BASE}/v2/tasks\",\n    json={\n        \"text\": \"Глава первая.\\nУтро началось с дождя.\\nГлава вторая.\",\n        \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\",\n        \"engine\": \"original\",\n        \"model_id\": \"eleven_v3\",\n        \"voice_settings\": {\n            \"stability\": 0.45,\n            \"similarity_boost\": 0.8,\n            \"style\": 0.2,\n            \"use_speaker_boost\": True,\n            \"speed\": 1.05,\n        },\n        \"split_type\": \"paragraphs\",\n        \"split_output\": False,\n        \"auto_pause\": {\n            \"enabled\": True,\n            \"duration\": 1.2,\n            \"frequency\": 1,\n        },\n    },\n    timeout=60,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"engine\": \"original\",\n  \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\",\n  \"model_id\": \"eleven_v3\",\n  \"chunks_count\": 3,\n  \"characters\": 50,\n  \"charged_characters\": 50\n}"},{"title":"Cartesia клоном, ZIP по чанкам","curl":"curl -X POST \"https://voicer.mat3u.com/v2/tasks\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"text\": \"Добро пожаловать на курс. Сегодня разберём основы.\",\n  \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n  \"engine\": \"cartesia\",\n  \"model_id\": \"sonic-3.6\",\n  \"language\": \"ru\",\n  \"max_chunk_length\": 500,\n  \"split_output\": true\n}'","python":"r = s.post(\n    f\"{BASE}/v2/tasks\",\n    json={\n        \"text\": \"Добро пожаловать на курс. Сегодня разберём основы.\",\n        \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n        \"engine\": \"cartesia\",\n        \"model_id\": \"sonic-3.6\",\n        \"language\": \"ru\",\n        \"max_chunk_length\": 500,\n        \"split_output\": True,\n    },\n    timeout=60,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"engine\": \"cartesia\",\n  \"voice_id\": \"8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36\",\n  \"model_id\": \"sonic-3.6\",\n  \"chunks_count\": 1,\n  \"characters\": 50,\n  \"charged_characters\": 50\n}"},{"title":"ElevenLabs с дубляжом: английский и немецкий другими голосами","curl":"curl -X POST \"https://voicer.mat3u.com/v2/tasks\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"text\": \"Сегодня мы запускаем дубляж.\",\n  \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\",\n  \"model_id\": \"eleven_v3\",\n  \"dub_languages\": [\n    \"en\",\n    \"de\"\n  ],\n  \"dub_voices\": {\n    \"en\": \"pNInz6obpgDQGcFmaJgB\",\n    \"de\": \"EXAVITQu4vr4xnSDxMaL\"\n  }\n}'","python":"r = s.post(\n    f\"{BASE}/v2/tasks\",\n    json={\n        \"text\": \"Сегодня мы запускаем дубляж.\",\n        \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\",\n        \"model_id\": \"eleven_v3\",\n        \"dub_languages\": [\n            \"en\",\n            \"de\",\n        ],\n        \"dub_voices\": {\n            \"en\": \"pNInz6obpgDQGcFmaJgB\",\n            \"de\": \"EXAVITQu4vr4xnSDxMaL\",\n        },\n    },\n    timeout=60,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"engine\": \"original\",\n  \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\",\n  \"model_id\": \"eleven_v3\",\n  \"chunks_count\": 1,\n  \"characters\": 28,\n  \"charged_characters\": 112,\n  \"dubs\": [\n    {\n      \"language\": \"en\",\n      \"task_id\": \"a5c15c55-c861-4867-85ea-291789894745\",\n      \"status\": \"pending\",\n      \"progress_percent\": 0.0,\n      \"voice_id\": \"pNInz6obpgDQGcFmaJgB\"\n    },\n    {\n      \"language\": \"de\",\n      \"task_id\": \"f91a2949-f4b8-49dc-9ec1-dbddd0828a82\",\n      \"status\": \"pending\",\n      \"progress_percent\": 0.0,\n      \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\"\n    }\n  ]\n}"}],"notes":[],"section":"tasks","anchor":"#tasks-create"},{"id":"tasks-list","method":"GET","path":"/v2/tasks","title":"Активные задачи ключа","summary":"Задачи, созданные этим API-ключом и ещё не завершённые: `pending`, `processing`, `pending_confirmation`. Другие ключи того же пользователя не видны. Пустой список, если активных нет.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"tasks","type":"array","description":"Активные задачи ключа, от старых к новым. Поля как у [GET /v2/tasks/{task_id}](#tasks-get)"},{"name":"tasks[].task_id","type":"string","description":"ID задачи"},{"name":"tasks[].status","type":"string","description":"`pending`, `processing`, `pending_confirmation`, `completed`, `censored`, `failed`, `cancelled`"},{"name":"tasks[].engine","type":"string | null","description":"Движок задачи"},{"name":"tasks[].progress_percent","type":"number","description":"Готовность 0-100"},{"name":"tasks[].chunks_completed, chunks_total","type":"integer","description":"Озвучено чанков из общего числа"},{"name":"tasks[].split_output","type":"boolean","description":"Результат будет ZIP"},{"name":"tasks[].created_at, started_at, completed_at","type":"datetime | null","description":"Время этапов"},{"name":"tasks[].error","type":"object | null","description":"`{type, message}`; `type`: `content_blocked`, `failover_confirmation_required` и др."},{"name":"tasks[].blocked_chunks","type":"array | null","description":"При `censored`: `[{index, text}]` заблокированных чанков"},{"name":"tasks[].dubs","type":"array | null","description":"У задачи с дубляжом: `[{language, task_id, status, progress_percent, voice_id}]` дорожек. Сначала озвучивается оригинал, потом языки по очереди; все файлы становятся `completed` вместе, когда длина дорожек выровнена"},{"name":"tasks[].dub_of, dub_language","type":"string | null","description":"У дорожки дубляжа: основная задача и язык"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"}],"examples":[{"title":"Есть активные","curl":"curl \"https://voicer.mat3u.com/v2/tasks\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/tasks\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"tasks\": [\n    {\n      \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n      \"status\": \"processing\",\n      \"engine\": \"original\",\n      \"progress_percent\": 40.0,\n      \"chunks_completed\": 2,\n      \"chunks_total\": 5,\n      \"split_output\": false,\n      \"created_at\": \"2026-10-11T16:20:03Z\",\n      \"started_at\": \"2026-10-11T16:20:05Z\",\n      \"completed_at\": null,\n      \"error\": null,\n      \"blocked_chunks\": null\n    }\n  ]\n}"},{"title":"Нет активных","curl":"curl \"https://voicer.mat3u.com/v2/tasks\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"r = s.get(f\"{BASE}/v2/tasks\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"tasks\": []\n}"}],"notes":[],"section":"tasks","anchor":"#tasks-list"},{"id":"tasks-get","method":"GET","path":"/v2/tasks/{task_id}","title":"Статус задачи","summary":"Статус, прогресс и ошибка своей задачи. Для `censored` в `blocked_chunks` лежат тексты фрагментов, которые нужно исправить.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"ID задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"task_id","type":"string","description":"ID задачи"},{"name":"status","type":"string","description":"`pending`, `processing`, `pending_confirmation`, `completed`, `censored`, `failed`, `cancelled`"},{"name":"engine","type":"string | null","description":"Движок задачи"},{"name":"progress_percent","type":"number","description":"Готовность 0-100"},{"name":"chunks_completed, chunks_total","type":"integer","description":"Озвучено чанков из общего числа"},{"name":"split_output","type":"boolean","description":"Результат будет ZIP"},{"name":"created_at, started_at, completed_at","type":"datetime | null","description":"Время этапов"},{"name":"error","type":"object | null","description":"`{type, message}`; `type`: `content_blocked`, `failover_confirmation_required` и др."},{"name":"blocked_chunks","type":"array | null","description":"При `censored`: `[{index, text}]` заблокированных чанков"},{"name":"dubs","type":"array | null","description":"У задачи с дубляжом: `[{language, task_id, status, progress_percent, voice_id}]` дорожек. Сначала озвучивается оригинал, потом языки по очереди; все файлы становятся `completed` вместе, когда длина дорожек выровнена"},{"name":"dub_of, dub_language","type":"string | null","description":"У дорожки дубляжа: основная задача и язык"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":"task_not_found","when":"Задачи нет или она чужая"}],"examples":[{"title":"В работе","curl":"curl \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nr = s.get(f\"{BASE}/v2/tasks/{task_id}\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"processing\",\n  \"engine\": \"original\",\n  \"progress_percent\": 40.0,\n  \"chunks_completed\": 2,\n  \"chunks_total\": 5,\n  \"split_output\": false,\n  \"created_at\": \"2026-10-11T16:20:03Z\",\n  \"started_at\": \"2026-10-11T16:20:05Z\",\n  \"completed_at\": null,\n  \"error\": null,\n  \"blocked_chunks\": null\n}"},{"title":"Заблокировано цензурой","curl":"curl \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nr = s.get(f\"{BASE}/v2/tasks/{task_id}\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"censored\",\n  \"engine\": \"original\",\n  \"progress_percent\": 80.0,\n  \"chunks_completed\": 4,\n  \"chunks_total\": 5,\n  \"split_output\": false,\n  \"created_at\": \"2026-10-11T16:20:03Z\",\n  \"started_at\": \"2026-10-11T16:20:05Z\",\n  \"completed_at\": \"2026-10-11T16:21:12Z\",\n  \"error\": {\n    \"type\": \"content_blocked\",\n    \"message\": \"1 чанк(ов) заблокировано цензурой ElevenLabs\"\n  },\n  \"blocked_chunks\": [\n    {\n      \"index\": 3,\n      \"text\": \"Фрагмент, который не пропустил фильтр.\"\n    }\n  ]\n}"}],"notes":[],"section":"tasks","anchor":"#tasks-get"},{"id":"tasks-cancel","method":"POST","path":"/v2/tasks/{task_id}/cancel","title":"Отменить задачу","summary":"Отменяет задачу в очереди и возвращает списанные символы. Задачу, которая уже озвучивается, можно отменить только на безлимитной подписке (символы за неё не списывались, возвращать нечего).","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"ID задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"task_id","type":"string","description":"ID задачи"},{"name":"status","type":"string","description":"`cancelled`"},{"name":"previous_status","type":"string","description":"Статус до отмены"},{"name":"refunded_characters","type":"integer","description":"Возвращено символов"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":"task_not_found","when":"Задачи нет или она чужая"},{"status":409,"code":"already_processing","when":"Уже озвучивается, а подписка не безлимитная"},{"status":409,"code":"already_cancelled","when":"Уже отменена"},{"status":409,"code":"not_cancellable","when":"В этом статусе отменить нельзя (`status`)"},{"status":409,"code":"dub_track_not_cancellable","when":"Дорожка дубляжа отменяется только вместе с основной задачей (`dub_of`)"}],"examples":[{"title":"Отмена из очереди","curl":"curl -X POST \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/cancel\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nr = s.post(f\"{BASE}/v2/tasks/{task_id}/cancel\", timeout=30)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"cancelled\",\n  \"previous_status\": \"pending\",\n  \"refunded_characters\": 28\n}"}],"notes":[],"section":"tasks","anchor":"#tasks-cancel"},{"id":"tasks-retry","method":"POST","path":"/v2/tasks/{task_id}/retry","title":"Повторить после цензуры","summary":"Переозвучивает заблокированные фрагменты задачи `censored` с исправленным текстом. Остальные чанки не озвучиваются заново. Задача возвращается в `pending`.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"ID задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"corrected_chunks","where":"body","type":"array","description":"Исправленный текст ровно для каждого `index` из `blocked_chunks`, не больше и не меньше","required":true,"default":null,"constraints":"минимум 1 элемент","values":[],"fields":[{"name":"index","where":"body","type":"integer","description":"Индекс из `blocked_chunks`","required":true,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"text","where":"body","type":"string","description":"Новый текст фрагмента","required":true,"default":null,"constraints":"1-2500 символов, не только пробелы","values":[],"fields":[]}]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"task_id","type":"string","description":"ID задачи"},{"name":"status","type":"string","description":"`pending`"},{"name":"retry_chunks_count","type":"integer","description":"Сколько фрагментов переозвучивается"},{"name":"charged_characters","type":"integer","description":"Доплата за символы сверх длины исходных фрагментов"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":400,"code":"retry_chunks_mismatch","when":"Индексы не совпадают (`missing`, `unexpected`)"},{"status":400,"code":"duplicate_chunk_index","when":"Индекс повторяется"},{"status":400,"code":"empty_text","when":"Пустой текст фрагмента (`indices`)"},{"status":402,"code":"insufficient_characters","when":"Текст длиннее, а символов на доплату нет"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":404,"code":"task_not_found","when":"Задачи нет или она чужая"},{"status":409,"code":"not_censored","when":"Задача не в статусе `censored`"},{"status":409,"code":"retry_unavailable","when":"Данных для повтора нет, создайте новую задачу"},{"status":503,"code":"queue_unavailable","when":"Очередь недоступна; задача осталась `censored`"}],"examples":[{"title":"Исправить часть диалога","curl":"curl -X POST \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/retry\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"corrected_chunks\": [\n    {\n      \"index\": 0,\n      \"text\": \"[EXAVITQu4vr4xnSDxMaL]: Ты уже слышал про диалоги?\\n[CwhRBWXzGAHq8TQ4Fs17]: Слышал. Сейчас и проверим.\"\n    }\n  ]\n}'","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nr = s.post(\n    f\"{BASE}/v2/tasks/{task_id}/retry\",\n    json={\n        \"corrected_chunks\": [\n            {\n                \"index\": 0,\n                \"text\": \"[EXAVITQu4vr4xnSDxMaL]: Ты уже слышал про диалоги?\\n[CwhRBWXzGAHq8TQ4Fs17]: Слышал. Сейчас и проверим.\",\n            },\n        ],\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"retry_chunks_count\": 1,\n  \"charged_characters\": 0\n}"},{"title":"Исправить один фрагмент","curl":"curl -X POST \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/retry\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"corrected_chunks\": [\n    {\n      \"index\": 3,\n      \"text\": \"Фрагмент, переписанный мягче.\"\n    }\n  ]\n}'","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nr = s.post(\n    f\"{BASE}/v2/tasks/{task_id}/retry\",\n    json={\n        \"corrected_chunks\": [\n            {\n                \"index\": 3,\n                \"text\": \"Фрагмент, переписанный мягче.\",\n            },\n        ],\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"retry_chunks_count\": 1,\n  \"charged_characters\": 0\n}"}],"notes":[],"section":"tasks","anchor":"#tasks-retry"},{"id":"dialogues-create","method":"POST","path":"/v2/dialogues","title":"Создать диалог","summary":"Реплики нескольких голосов в одном файле. Символы списываются сразу за весь текст, ответ `202` с `task_id`. Статус, скачивание и отмена: как у задач: [GET /v2/tasks/{task_id}](#tasks-get), [/download](#tasks-download), [/cancel](#tasks-cancel).","auth":"token","params":[{"name":"text","where":"body","type":"string","description":"Диалог одним текстом: каждая реплика с новой строки, голос в начале строки в квадратных скобках и с двоеточием. Реплика на несколько строк продолжается без пометки голоса. Передаётся либо `text`, либо `inputs`. Как выглядит такой текст: [Как писать текст](#dialogue-text)","required":false,"default":null,"constraints":"до 1 000 000 символов","values":[],"fields":[]},{"name":"inputs","where":"body","type":"array","description":"Реплики по порядку, если не передан `text`","required":false,"default":null,"constraints":"1-2000 реплик","values":[],"fields":[{"name":"text","where":"body","type":"string","description":"Текст реплики","required":true,"default":null,"constraints":"1-10 000 символов","values":[],"fields":[]},{"name":"voice_id","where":"body","type":"string","description":"Голос реплики","required":true,"default":null,"constraints":"1-50 символов","values":[],"fields":[]}]},{"name":"engine","where":"body","type":"string","description":"Движок","required":false,"default":"\"labs\"","constraints":null,"values":[{"value":"labs","description":"ElevenLabs text-to-dialogue: часть диалога озвучивается одним запросом"},{"value":"cartesia","description":"Каждая реплика отдельным запросом Cartesia TTS, затем склейка"}],"fields":[]},{"name":"model_id","where":"body","type":"string","description":"Модель. Для `labs` не указана: `eleven_v4`; доступны ещё `eleven_v4_turbo` и `eleven_v3`. Для `cartesia` как у задач Cartesia, по умолчанию `sonic-3.6`","required":false,"default":null,"constraints":"до 50 символов","values":[],"fields":[]},{"name":"language_code","where":"body","type":"string","description":"Язык текста. Для `cartesia` выбирает клон голоса ElevenLabs этого языка и язык синтеза; не указан: определяется по тексту реплик. Для `labs` передаётся в ElevenLabs как есть, можно не указывать","required":false,"default":null,"constraints":"2-8 символов, например `ru`, `en`, `de`","values":[],"fields":[]},{"name":"settings","where":"body","type":"object","description":"Настройки голоса ElevenLabs, только для `labs`. Cartesia их игнорирует","required":false,"default":null,"constraints":null,"values":[],"fields":[{"name":"stability","where":"body","type":"number","description":"Стабильность интонации: 0 творчески, 0.5 естественно, 1 ровно","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]}]},{"name":"seed","where":"body","type":"integer","description":"Повторяемость результата, только для `labs`. Cartesia его игнорирует","required":false,"default":null,"constraints":"0-4 294 967 295","values":[],"fields":[]},{"name":"split_output","where":"body","type":"boolean","description":"`true`: результат ZIP с MP3 по частям вместо одного MP3","required":false,"default":"false","constraints":null,"values":[],"fields":[]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"task_id","type":"string","description":"ID задачи"},{"name":"status","type":"string","description":"Всегда `pending`"},{"name":"engine","type":"string","description":"Выбранный движок"},{"name":"model_id","type":"string","description":"Выбранная модель"},{"name":"voices","type":"array","description":"Голоса после проверки, в порядке появления (у Cartesia ID клонов)"},{"name":"language_code","type":"string","description":"Для `cartesia` язык озвучки: из запроса или определённый по тексту; для `labs` значение из запроса, иначе `null`"},{"name":"lines_count","type":"integer","description":"Реплик"},{"name":"parts_count","type":"integer","description":"Запросов к провайдеру (чанков задачи)"},{"name":"characters","type":"integer","description":"Длина всех реплик"},{"name":"charged_characters","type":"integer","description":"Списано символов; `0` на безлимите"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":400,"code":"empty_text","when":"В репликах нет ничего, что можно озвучить"},{"status":400,"code":"too_many_voices","when":"В диалоге больше 10 разных голосов"},{"status":400,"code":"too_many_chunks","when":"Частей больше `max_chunks_per_task` тарифа"},{"status":400,"code":"voice_not_found","when":"Голос не найден для этого движка"},{"status":400,"code":"invalid_model","when":"Модель не поддерживается"},{"status":402,"code":"subscription_required","when":"Нет подписки или пакета символов"},{"status":402,"code":"subscription_expired","when":"Безлимитная подписка закончилась"},{"status":402,"code":"insufficient_characters","when":"Не хватает символов"},{"status":403,"code":"dialogues_closed","when":"Диалоги в закрытом тесте, пользователь не в списке"},{"status":403,"code":"dialogues_disabled","when":"Диалоги отключены"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":403,"code":"engine_not_allowed","when":"Движок закрыт тарифом"},{"status":429,"code":"too_many_active_tasks","when":"Достигнут `max_parallel_tasks` лицензии"},{"status":503,"code":"queue_unavailable","when":"Очередь недоступна, символы возвращены"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs недоступен для проверки голоса"},{"status":503,"code":"maintenance","when":"Технические работы, новые задачи не принимаются"}],"examples":[{"title":"Текст с голосами в строках","curl":"curl -X POST \"https://voicer.mat3u.com/v2/dialogues\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"text\": \"[EXAVITQu4vr4xnSDxMaL]: [excited] Ты уже слышал про диалоги?\\n[CwhRBWXzGAHq8TQ4Fs17]: [laughs] Слышал. Сейчас и проверим.\"\n}'","python":"r = s.post(\n    f\"{BASE}/v2/dialogues\",\n    json={\n        \"text\": \"[EXAVITQu4vr4xnSDxMaL]: [excited] Ты уже слышал про диалоги?\\n[CwhRBWXzGAHq8TQ4Fs17]: [laughs] Слышал. Сейчас и проверим.\",\n    },\n    timeout=60,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"engine\": \"labs\",\n  \"model_id\": \"eleven_v4\",\n  \"voices\": [\n    \"EXAVITQu4vr4xnSDxMaL\",\n    \"CwhRBWXzGAHq8TQ4Fs17\"\n  ],\n  \"language_code\": null,\n  \"lines_count\": 2,\n  \"parts_count\": 1,\n  \"characters\": 72,\n  \"charged_characters\": 72\n}"},{"title":"Labs, реплики по отдельности","curl":"curl -X POST \"https://voicer.mat3u.com/v2/dialogues\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"inputs\": [\n    {\n      \"text\": \"[excited] Ты уже слышал про диалоги?\",\n      \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\"\n    },\n    {\n      \"text\": \"[laughs] Слышал. Сейчас и проверим.\",\n      \"voice_id\": \"CwhRBWXzGAHq8TQ4Fs17\"\n    }\n  ]\n}'","python":"r = s.post(\n    f\"{BASE}/v2/dialogues\",\n    json={\n        \"inputs\": [\n            {\n                \"text\": \"[excited] Ты уже слышал про диалоги?\",\n                \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\",\n            },\n            {\n                \"text\": \"[laughs] Слышал. Сейчас и проверим.\",\n                \"voice_id\": \"CwhRBWXzGAHq8TQ4Fs17\",\n            },\n        ],\n    },\n    timeout=60,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"engine\": \"labs\",\n  \"model_id\": \"eleven_v4\",\n  \"voices\": [\n    \"EXAVITQu4vr4xnSDxMaL\",\n    \"CwhRBWXzGAHq8TQ4Fs17\"\n  ],\n  \"language_code\": null,\n  \"lines_count\": 2,\n  \"parts_count\": 1,\n  \"characters\": 62,\n  \"charged_characters\": 62\n}"},{"title":"Cartesia: язык определяется по тексту","curl":"curl -X POST \"https://voicer.mat3u.com/v2/dialogues\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"engine\": \"cartesia\",\n  \"inputs\": [\n    {\n      \"text\": \"Слушай, ты видел вчерашний отчёт?\",\n      \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\"\n    },\n    {\n      \"text\": \"Видел. Половина посчитана по старой методике.\",\n      \"voice_id\": \"CwhRBWXzGAHq8TQ4Fs17\"\n    }\n  ]\n}'","python":"r = s.post(\n    f\"{BASE}/v2/dialogues\",\n    json={\n        \"engine\": \"cartesia\",\n        \"inputs\": [\n            {\n                \"text\": \"Слушай, ты видел вчерашний отчёт?\",\n                \"voice_id\": \"EXAVITQu4vr4xnSDxMaL\",\n            },\n            {\n                \"text\": \"Видел. Половина посчитана по старой методике.\",\n                \"voice_id\": \"CwhRBWXzGAHq8TQ4Fs17\",\n            },\n        ],\n    },\n    timeout=60,\n)\nr.raise_for_status()\nprint(r.json())","status":202,"response":"{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"status\": \"pending\",\n  \"engine\": \"cartesia\",\n  \"model_id\": \"sonic-3.6\",\n  \"voices\": [\n    \"3a775eba-b397-4f6a-ad71-7e84163c3781\",\n    \"d3419c87-ace1-4529-a916-dc1b4537d979\"\n  ],\n  \"language_code\": \"ru\",\n  \"lines_count\": 2,\n  \"parts_count\": 1,\n  \"characters\": 75,\n  \"charged_characters\": 75\n}"}],"notes":[],"section":"dialogues","anchor":"#dialogues-create"},{"id":"tasks-download","method":"GET","path":"/v2/tasks/{task_id}/download","title":"Скачать результат","summary":"MP3 завершённой задачи или ZIP с MP3 по чанкам, если задача создана со `split_output: true`. Первое скачивание длинной задачи собирает файл из чанков и может занять до нескольких минут, следующие отдаются сразу.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"ID задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]}],"content_type":null,"response_type":"audio/mpeg | application/zip","response":[{"name":"Content-Disposition","type":"header","description":"`voice_<task_id>.mp3` или `voice_<task_id>_chunks.zip`"},{"name":"Content-Length","type":"header","description":"Размер файла"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":"task_not_found","when":"Задачи нет или она чужая"},{"status":409,"code":"task_not_completed","when":"Задача ещё не `completed` (`status`)"},{"status":409,"code":"task_incomplete","when":"Готовы не все чанки (`ready`, `total`, `missing`)"},{"status":410,"code":"result_expired","when":"Аудио уже удалено по сроку хранения"}],"examples":[{"title":"Сохранить MP3","curl":"curl \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/download\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -o voice.mp3","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nwith s.get(f\"{BASE}/v2/tasks/{task_id}/download\", stream=True, timeout=600) as r:\n    r.raise_for_status()\n    with open(\"voice.mp3\", \"wb\") as f:\n        for piece in r.iter_content(1 << 16):\n            f.write(piece)","status":200,"response":"MP3 (audio/mpeg)"}],"notes":["Внутри ZIP файлы называются по номеру чанка с нулями: `0000.mp3`, `0001.mp3` и т.д. Пауза `auto_pause` в ZIP-режиме лежит в конце соответствующего файла."],"section":"results","anchor":"#tasks-download"},{"id":"tasks-download-link","method":"POST","path":"/v2/tasks/{task_id}/download-link","title":"Ссылка на скачивание без токена","summary":"Короткоживущая подписанная ссылка на файл. Её можно отдать браузеру, плееру или пользователю: токен в URL не попадает.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"ID задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"ttl_seconds","where":"query","type":"integer","description":"Срок жизни ссылки в секундах. По умолчанию 3600","required":false,"default":null,"constraints":"60-86400","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"url","type":"string","description":"Готовая ссылка на /v2/tasks/{task_id}/file"},{"name":"expires_at","type":"datetime","description":"Когда ссылка перестанет работать"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":"task_not_found","when":"Задачи нет или она чужая"},{"status":409,"code":"task_not_completed","when":"Задача ещё не `completed` (`status`)"},{"status":409,"code":"task_incomplete","when":"Готовы не все чанки (`ready`, `total`, `missing`)"},{"status":503,"code":"download_signing_disabled","when":"Подписанные ссылки не настроены на сервере"}],"examples":[{"title":"Ссылка на 10 минут","curl":"curl -G -X POST \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/download-link\" \\\n  --data-urlencode \"ttl_seconds=600\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\"","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nr = s.post(\n    f\"{BASE}/v2/tasks/{task_id}/download-link\",\n    params={\n        \"ttl_seconds\": 600,\n    },\n    timeout=30,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"url\": \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/file?exp=1792327200&sig=9f2c4e7a1b3d5f60718293a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4\",\n  \"expires_at\": \"2026-10-11T17:20:00Z\"\n}"}],"notes":[],"section":"results","anchor":"#tasks-download-link"},{"id":"tasks-file","method":"GET","path":"/v2/tasks/{task_id}/file","title":"Скачать по подписанной ссылке","summary":"То же, что /download, но вместо токена подпись из [/download-link](#tasks-download-link). Обычно URL не собирают вручную, а берут целиком из `url`.","auth":"signed","params":[{"name":"task_id","where":"path","type":"string","description":"ID задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"exp","where":"query","type":"integer","description":"Unix-время окончания ссылки","required":true,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"sig","where":"query","type":"string","description":"HMAC-подпись","required":true,"default":null,"constraints":"64 шестнадцатеричных символа","values":[],"fields":[]}],"content_type":null,"response_type":"audio/mpeg | application/zip","response":[],"errors":[{"status":401,"code":"invalid_download_link","when":"Подпись неверна или срок истёк"},{"status":409,"code":"task_not_completed","when":"Задача ещё не `completed` (`status`)"},{"status":409,"code":"task_incomplete","when":"Готовы не все чанки (`ready`, `total`, `missing`)"},{"status":410,"code":"result_expired","when":"Аудио уже удалено по сроку хранения"}],"examples":[{"title":"Скачать","curl":"curl -G \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/file\" \\\n  --data-urlencode \"exp=1792327200\" \\\n  --data-urlencode \"sig=9f2c4e7a1b3d5f60718293a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4\" \\\n  -o voice.mp3","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nwith requests.get(\n    f\"{BASE}/v2/tasks/{task_id}/file\",\n    params={\n        \"exp\": \"1792327200\",\n        \"sig\": \"9f2c4e7a1b3d5f60718293a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4\",\n    },\n    stream=True,\n    timeout=600,\n) as r:\n    r.raise_for_status()\n    with open(\"voice.mp3\", \"wb\") as f:\n        for piece in r.iter_content(1 << 16):\n            f.write(piece)","status":200,"response":"MP3 (audio/mpeg)"}],"notes":[],"section":"results","anchor":"#tasks-file"},{"id":"tasks-subtitles","method":"GET","path":"/v2/tasks/{task_id}/subtitles","title":"Субтитры из меток ElevenLabs","summary":"Мгновенные субтитры из временных меток, которые ElevenLabs возвращает вместе с аудио. Работают для задач `engine=original` в статусе `completed` или `censored`. Паузы `auto_pause` учтены.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"ID задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"format","where":"query","type":"string","description":"Формат файла","required":false,"default":"\"srt\"","constraints":null,"values":[{"value":"srt","description":"SubRip, `application/x-subrip`"},{"value":"vtt","description":"WebVTT, `text/vtt`"},{"value":"json","description":"Метки по символам: `characters`, `character_start_times_seconds`, `character_end_times_seconds`"}],"fields":[]}],"content_type":null,"response_type":"application/x-subrip | text/vtt | application/json | application/zip","response":[],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":"task_not_found","when":"Задачи нет или она чужая"},{"status":409,"code":"task_not_ready","when":"Озвучка ещё не закончена"},{"status":409,"code":"no_timestamps","when":"У задачи нет меток (обычно это Cartesia)"}],"examples":[{"title":"SRT","curl":"curl -G \"https://voicer.mat3u.com/v2/tasks/6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03/subtitles\" \\\n  --data-urlencode \"format=srt\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -o voice.srt","python":"task_id = \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\"\nwith s.get(\n    f\"{BASE}/v2/tasks/{task_id}/subtitles\",\n    params={\n        \"format\": \"srt\",\n    },\n    stream=True,\n    timeout=30,\n) as r:\n    r.raise_for_status()\n    with open(\"voice.srt\", \"wb\") as f:\n        for piece in r.iter_content(1 << 16):\n            f.write(piece)","status":200,"response":"1\n00:00:00,000 --> 00:00:02,310\nПривет! Это тест Voicer API.\n"}],"notes":["При `split_output: true` приходит ZIP `<task_id>_subtitles.zip` с файлом на каждый чанк; таймкоды в каждом файле начинаются с нуля.","Метки хранятся час после завершения задачи, потом приходит `409 no_timestamps`. Запрашивайте субтитры сразу после `completed`.","Для [дубляжа](#dubbing) запросите субтитры по `task_id` каждой дорожки из `dubs`: таймкоды совпадают с выровненным аудио дорожки."],"section":"subtitles","anchor":"#tasks-subtitles"},{"id":"captions-create","method":"POST","path":"/v2/captions","title":"Субтитры распознаванием речи","summary":"Субтитры готовой озвучки через распознавание речи. Подходит для любого движка, в том числе Cartesia. Символы не списываются. Запрос синхронный, длится от секунд до пары минут.","auth":"token","params":[{"name":"task_id","where":"body","type":"string","description":"ID своей задачи","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"format","where":"body","type":"string","description":"Формат файла","required":false,"default":"\"srt\"","constraints":null,"values":[{"value":"srt","description":"SubRip"},{"value":"vtt","description":"WebVTT"}],"fields":[]},{"name":"language","where":"body","type":"string","description":"Язык речи: ISO 639-1 (`ru`, `en`, `uk`, `de`...) или `auto`. Пусто или `auto`: определить по аудио среди ru, en, uk","required":false,"default":null,"constraints":"до 16 символов","values":[],"fields":[]}],"content_type":"application/json","response_type":"application/x-subrip | text/vtt | application/zip","response":[],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":404,"code":"task_not_found","when":"Задачи нет или она чужая"},{"status":409,"code":"task_not_ready","when":"Озвучка ещё не закончена"},{"status":422,"code":"invalid_language","when":"Код языка не распознан"},{"status":502,"code":"transcription_failed","when":"Не удалось распознать речь"},{"status":503,"code":"transcription_timeout","when":"Распознавание заняло слишком много времени"},{"status":503,"code":"no_account_available","when":"Распознавание временно недоступно"}],"examples":[{"title":"SRT на русском","curl":"curl -X POST \"https://voicer.mat3u.com/v2/captions\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n  \"format\": \"srt\",\n  \"language\": \"ru\"\n}' \\\n  -o voice.srt","python":"with s.post(\n    f\"{BASE}/v2/captions\",\n    json={\n        \"task_id\": \"6b1d7e42-0c3a-4f8e-9a51-d2c47e8b9f03\",\n        \"format\": \"srt\",\n        \"language\": \"ru\",\n    },\n    stream=True,\n    timeout=300,\n) as r:\n    r.raise_for_status()\n    with open(\"voice.srt\", \"wb\") as f:\n        for piece in r.iter_content(1 << 16):\n            f.write(piece)","status":200,"response":"1\n00:00:00,120 --> 00:00:02,280\nПривет! Это тест Voicer API.\n"}],"notes":["Для задачи с `split_output: true` приходит ZIP с файлом `0000.srt`, `0001.srt` на каждый чанк. Для задачи с `auto_pause` каждый чанк распознаётся отдельно и сдвигается на длительность предыдущих, поэтому таймкоды совпадают с паузами в MP3."],"section":"subtitles","anchor":"#captions-create"},{"id":"captions-upload","method":"POST","path":"/v2/captions/upload","title":"Субтитры для своего аудио","summary":"Субтитры для любого аудиофайла без задачи озвучки. Имя результата берётся из имени файла.","auth":"token","params":[{"name":"file","where":"form","type":"file","description":"Аудиофайл","required":true,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"format","where":"form","type":"string","description":"Формат файла","required":false,"default":"\"srt\"","constraints":null,"values":[{"value":"srt","description":"SubRip"},{"value":"vtt","description":"WebVTT"}],"fields":[]},{"name":"language","where":"form","type":"string","description":"Язык речи: ISO 639-1 или `auto`; пусто: определить по аудио","required":false,"default":null,"constraints":null,"values":[],"fields":[]}],"content_type":"multipart/form-data","response_type":"application/x-subrip | text/vtt","response":[],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":400,"code":"empty_audio","when":"Пустой файл"},{"status":422,"code":"invalid_language","when":"Код языка не распознан"},{"status":502,"code":"transcription_failed","when":"Не удалось распознать речь"},{"status":503,"code":"transcription_timeout","when":"Распознавание заняло слишком много времени"},{"status":503,"code":"no_account_available","when":"Распознавание временно недоступно"}],"examples":[{"title":"VTT для подкаста","curl":"curl -X POST \"https://voicer.mat3u.com/v2/captions/upload\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -F \"format=vtt\" \\\n  -F \"language=auto\" \\\n  -F \"file=@podcast.mp3\" \\\n  -o podcast.vtt","python":"with s.post(\n    f\"{BASE}/v2/captions/upload\",\n    data={\n        \"format\": \"vtt\",\n        \"language\": \"auto\",\n    },\n    files={\"file\": open(\"podcast.mp3\", \"rb\")},\n    stream=True,\n    timeout=300,\n) as r:\n    r.raise_for_status()\n    with open(\"podcast.vtt\", \"wb\") as f:\n        for piece in r.iter_content(1 << 16):\n            f.write(piece)","status":200,"response":"WEBVTT\n\n00:00.000 --> 00:03.420\nДобрый вечер, это выпуск номер сорок два.\n"}],"notes":[],"section":"subtitles","anchor":"#captions-upload"},{"id":"studio-music","method":"POST","path":"/v2/music","title":"Создать музыку","summary":"Трек по текстовому промпту. Запрос синхронный и не списывает символы. Нужна активная подписка: безлимит в сроке или пакет с остатком. `download_url` живёт около суток.","auth":"token","params":[{"name":"prompt","where":"body","type":"string","description":"Описание трека: жанр, настроение, эпоха","required":true,"default":null,"constraints":"1-2000 символов","values":[],"fields":[]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"id","type":"string","description":"ID трека у провайдера"},{"name":"status","type":"string","description":"Статус, например `generating_music`"},{"name":"progress","type":"number","description":"Прогресс от 0 до 1, если провайдер его прислал"},{"name":"prompt","type":"string","description":"Промпт, который ушёл в генерацию"},{"name":"title","type":"string","description":"Название трека"},{"name":"description","type":"string","description":"Короткое описание"},{"name":"genres","type":"string[]","description":"Жанры"},{"name":"bpm","type":"integer","description":"Темп"},{"name":"duration_ms","type":"integer","description":"Длина трека в миллисекундах"},{"name":"download_url","type":"string","description":"Ссылка на файл, обычно MP4"},{"name":"failure_reason","type":"string","description":"Причина сбоя, если она есть"},{"name":"waveform","type":"integer[]","description":"Амплитуды для отрисовки волны"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":402,"code":"subscription_required","when":"Нет активной подписки"},{"status":402,"code":"subscription_expired","when":"Срок безлимитной подписки истёк"},{"status":429,"code":"too_many_generations","when":"Превышен лимит потоков тарифа на этом ключе"},{"status":503,"code":"no_proxy","when":"Генерация временно недоступна"},{"status":502,"code":"generation_failed","when":"Запрос не принят или ответ не разобран"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs не ответил, повторите позже"}],"examples":[{"title":"Дабстеп","curl":"curl -X POST \"https://voicer.mat3u.com/v2/music\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"prompt\": \"dapstep 2012\"\n}'","python":"r = s.post(\n    f\"{BASE}/v2/music\",\n    json={\n        \"prompt\": \"dapstep 2012\",\n    },\n    timeout=120,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"id\": \"b2WXbFqLJFRpGXFCxhil\",\n  \"status\": \"generating_music\",\n  \"progress\": 1.0,\n  \"prompt\": \"dapstep 2012\",\n  \"title\": \"Data Step\",\n  \"description\": \"A dark electronic track.\",\n  \"genres\": [\n    \"electronic\"\n  ],\n  \"bpm\": 140,\n  \"duration_ms\": 30000,\n  \"download_url\": \"https://storage.googleapis.com/example/track.mp4\",\n  \"failure_reason\": null,\n  \"waveform\": [\n    871,\n    -845\n  ]\n}"}],"notes":["Пока `status` не финальный, файл по `download_url` может ещё дописываться. Повторите скачивание через несколько секунд."],"section":"studio","anchor":"#studio-music"},{"id":"studio-sound","method":"POST","path":"/v2/sound-effects","title":"Создать звуковой эффект","summary":"Несколько вариантов эффекта по тексту. Запрос синхронный и не списывает символы. Нужна активная подписка. В `audio_base64` лежит само аудио (Opus), не картинка волны.","auth":"token","params":[{"name":"text","where":"body","type":"string","description":"Что должно звучать","required":true,"default":null,"constraints":"1-500 символов","values":[],"fields":[]},{"name":"loop","where":"body","type":"boolean","description":"Зациклить фрагмент","required":false,"default":"false","constraints":null,"values":[],"fields":[]},{"name":"output_format","where":"body","type":"string","description":"Формат аудио провайдера","required":false,"default":"\"opus_48000_128\"","constraints":"1-64 символа","values":[],"fields":[]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"items","type":"object[]","description":"Варианты эффекта"},{"name":"items[].id","type":"string","description":"ID варианта"},{"name":"items[].text","type":"string","description":"Текст запроса"},{"name":"items[].content_type","type":"string","description":"MIME, обычно `audio/opus`"},{"name":"items[].duration_seconds","type":"number","description":"Длина в секундах"},{"name":"items[].audio_base64","type":"string","description":"Аудио в base64"},{"name":"items[].subgroup_id","type":"string","description":"Общая группа вариантов одного запроса"},{"name":"items[].subgroup_position","type":"integer","description":"Номер варианта в группе"}],"errors":[{"status":401,"code":null,"when":"Нет заголовка Authorization или токен недействителен"},{"status":403,"code":"user_blocked","when":"Пользователь заблокирован"},{"status":402,"code":"subscription_required","when":"Нет активной подписки"},{"status":402,"code":"subscription_expired","when":"Срок безлимитной подписки истёк"},{"status":429,"code":"too_many_generations","when":"Превышен лимит потоков тарифа на этом ключе"},{"status":503,"code":"no_proxy","when":"Генерация временно недоступна"},{"status":502,"code":"generation_failed","when":"Запрос не принят или ответ не разобран"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs не ответил, повторите позже"}],"examples":[{"title":"Звук мотора","curl":"curl -X POST \"https://voicer.mat3u.com/v2/sound-effects\" \\\n  -H \"Authorization: Bearer $VOICER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"text\": \"звук мотора\",\n  \"loop\": false,\n  \"output_format\": \"opus_48000_128\"\n}'","python":"r = s.post(\n    f\"{BASE}/v2/sound-effects\",\n    json={\n        \"text\": \"звук мотора\",\n        \"loop\": False,\n        \"output_format\": \"opus_48000_128\",\n    },\n    timeout=90,\n)\nr.raise_for_status()\nprint(r.json())","status":200,"response":"{\n  \"items\": [\n    {\n      \"id\": \"2zjuIQWXhD2LY3KLArzI\",\n      \"text\": \"звук мотора\",\n      \"content_type\": \"audio/opus\",\n      \"duration_seconds\": 1.0,\n      \"audio_base64\": \"T2dnUw\",\n      \"subgroup_id\": \"IXeCrNEYdt2fy8KmsRhN\",\n      \"subgroup_position\": 1\n    }\n  ]\n}"}],"notes":[],"section":"studio","anchor":"#studio-sound"}],"nuances":[{"id":"dialogue-retry","title":"Повтор диалога правит текст, а голоса оставляет","text":"В `blocked_chunks` диалога `text` это часть целиком, со всеми репликами. В [/retry](#tasks-retry) пришлите её тем же текстом с голосами в строках, что и при создании: те же `voice_id` в том же порядке, меняется только текст реплик. Другой набор голосов или текст без пометок даёт `409 retry_unavailable`.","sections":["dialogues"]},{"id":"labs-clone-slots","title":"Клоны из голосов ElevenLabs не занимают слоты","text":"Клон, созданный с `elevenlabs_voice_id`, попадает в общий каталог и не расходует квоту `max_cartesia_clones`. Слот занимает только клон из своего аудио. Если клон этого голоса на этом языке уже есть, /clone вернёт его с `reused: true`, ничего не создавая.","sections":["cloning","cartesia"]},{"id":"clone-slots-count","title":"Слот освобождает только удаление","text":"`clones_used` считает свои клоны в любом статусе. Чтобы освободить слот, удалите клон через DELETE /v2/voices/cartesia/{voice_id}. Клоны общего каталога удалить нельзя, и слотов они не занимают.","sections":["cloning"]},{"id":"labs-id-in-task","title":"ID голоса ElevenLabs работает в задаче Cartesia","text":"В задачу с `engine=cartesia` можно передать ID голоса ElevenLabs, у которого есть клон: сервис возьмёт сначала ваш клон, затем клон из общего каталога. Если клона нет, будет `400 voice_not_found`: сначала вызовите /clone с `elevenlabs_voice_id`.","sections":["tasks","cartesia"]},{"id":"clone-languages","title":"Клон создаётся на указанном языке Cartesia","text":"Код из языков Sonic (`ru`, `en`, `de`, `uk`, `ja` и остальные) сохраняется как язык клона. Пустой код означает ru. Кода нет у Cartesia: неподдерживаемый славянский (`be`, `sr`, `bs`, `sl`, `mk`, `cnr`) даёт ru-клон, остальное даёт en-клон. `language` задачи выбирает клон того же голоса ElevenLabs на этом языке, если он есть, и уходит в синтез.","sections":["cloning","tasks"]},{"id":"library-voices-original","title":"Библиотечные голоса ElevenLabs не для engine=original","text":"Задача `engine=original` принимает только стандартные голоса ElevenLabs из таблицы. Голос из поиска или подборки даст `400 voice_not_allowed`. Озвучить им можно через клон Cartesia.","sections":["voices","tasks"]},{"id":"charge-on-create","title":"Символы списываются при создании","text":"Стоимость равна `len(text)`, с `dub_languages` она умножается на (1 + 1.5 × число языков), и списывается сразу. Символы возвращаются при отмене задачи из `pending`, при `503 queue_unavailable` и когда озвучка завершилась статусом `failed`. При `censored` символы не возвращаются: озвученная часть сохранена, а заблокированные фрагменты переозвучиваются через /retry.","sections":["tasks"]},{"id":"cancel-processing","title":"Начатую задачу отменяет только безлимит","text":"Задачу в `processing` можно отменить только на безлимитной подписке, где за неё ничего не списано. На пакете символов придёт `409 already_processing`.","sections":["tasks"]},{"id":"parallel-limit","title":"Лимит одновременных задач на лицензию","text":"Слот занимают задачи в `pending`, `processing` и `pending_confirmation`. Сверх `max_parallel_tasks` тарифа приходит `429 too_many_active_tasks`: дождитесь завершения одной из задач. Скорость самой задачи задаёт `threads_per_task`, сколько чанков озвучивается параллельно.","sections":["tasks","account"]},{"id":"cartesia-chunk","title":"Cartesia режет текст до 500 символов","text":"Для `engine=cartesia` `max_chunk_length` урезается до 500 в режимах `smart` и `max_length`. В режиме `paragraphs` строка уходит целиком, до 2500 символов.","sections":["tasks"]},{"id":"cjk-chunk","title":"Китайский, японский и корейский: до 500 символов","text":"Если больше 20% текста составляют иероглифы или хангыль, длина чанка ограничивается 500 символами для любого движка.","sections":["tasks"]},{"id":"quotes","title":"Кавычки нормализуются","text":"Все виды кавычек («», „“, “”, 「」) в чанках заменяются на `\"`, а непарная кавычка на краю чанка удаляется, чтобы модель её не произносила. Режим `smart` не разрывает текст внутри кавычек.","sections":["tasks"]},{"id":"voice-settings-cartesia","title":"voice_settings только для ElevenLabs","text":"Cartesia игнорирует `voice_settings`. Модель ElevenLabs (`eleven_*`) в задаче Cartesia не даёт ошибку, а заменяется на `sonic-3.6`.","sections":["tasks"]},{"id":"auto-pause","title":"Паузы между чанками","text":"`auto_pause` добавляет тишину `duration` секунд в конец каждого `frequency`-го чанка; после последнего чанка паузы нет. Паузы учитываются в субтитрах обоих способов. Чтобы паузы стояли между абзацами, используйте `split_type: paragraphs`.","sections":["tasks","subtitles"]},{"id":"split-output","title":"split_output: ZIP по чанкам","text":"С `split_output: true` /download отдаёт ZIP `0000.mp3`, `0001.mp3`, ... без склейки, а субтитры приходят ZIP-архивом с файлом на чанк и локальными таймкодами. Режим задаётся при создании задачи и потом не меняется.","sections":["results","subtitles"]},{"id":"download-first","title":"Первое скачивание медленнее","text":"Одиночный MP3 собирается из чанков при первом /download и кэшируется. Для длинных текстов ставьте таймаут чтения от 10 минут. Аудио хранится ограниченное время, после чего приходит `410 result_expired`.","sections":["results"]},{"id":"result-retention","title":"Аудио и метки хранятся час","text":"Через час после завершения задачи сервис удаляет её аудио и метки ElevenLabs: /download отвечает `410 result_expired`, /subtitles `409 no_timestamps`, и /v2/captions распознавать уже нечего. Забирайте файлы и субтитры сразу после `completed`. У [дубляжа](#dubbing) оригинал и все дорожки хранятся, пока не готов последний язык, и ещё час после него. Задача в `censored` хранит озвученное, пока ждёт /retry; сама запись задачи хранится 30 дней.","sections":["results","subtitles"]},{"id":"censored-retry","title":"Повтор после цензуры","text":"Переозвучиваются только `blocked_chunks`. Индексы в `corrected_chunks` должны совпасть с ними точно. Если новый текст не длиннее, повтор бесплатен и работает даже после окончания подписки. Пока задача `censored`, её субтитры через /subtitles уже доступны для озвученной части.","sections":["tasks"]},{"id":"pending-confirmation","title":"pending_confirmation не требует действий","text":"Статус появляется, когда основной синтез ElevenLabs временно деградировал. Задача ждёт решения оператора, отменить её из API нельзя. Продолжайте опрашивать статус.","sections":["tasks"]},{"id":"cartesia-subtitles","title":"Субтитры для Cartesia только через /v2/captions","text":"Cartesia не возвращает временные метки, поэтому /v2/tasks/{task_id}/subtitles даёт `409 no_timestamps`. Используйте POST /v2/captions с тем же `task_id`. Распознавание символы не тратит.","sections":["subtitles"]},{"id":"maintenance","title":"Технические работы","text":"Во время работ POST /v2/tasks отвечает `503 maintenance`. Остальные запросы, включая статус и скачивание, работают.","sections":["tasks"]},{"id":"studio-subscription","title":"Музыка и эффекты при активной подписке","text":"POST /v2/music и POST /v2/sound-effects не списывают символы и не занимают `max_parallel_tasks`. На один API-ключ одновременно идёт не больше `threads_per_task` тарифа, музыка и эффекты делят этот лимит. Нужна активная подписка: безлимит в сроке или пакет с остатком символов.","sections":["studio"]},{"id":"strict-body","title":"Лишние поля в теле запрещены","text":"Тело POST /v2/tasks и /retry проверяется строго: неизвестное поле, опечатка в имени или значение вне диапазона дают `422` со списком ошибок в `detail`.","sections":["tasks"]}],"error_codes":[{"code":"empty_text","statuses":[400],"meaning":"В тексте нет букв и цифр","action":"Проверить текст"},{"code":"text_too_long","statuses":[400],"meaning":"Текст длиннее `max_chars_per_task`","action":"Разбить на несколько задач"},{"code":"too_many_chunks","statuses":[400],"meaning":"Чанков больше `max_chunks_per_task`","action":"Увеличить `max_chunk_length` или разбить текст"},{"code":"invalid_split","statuses":[400],"meaning":"Абзац длиннее 2500 символов в `paragraphs`","action":"Разбить абзац или взять `smart`"},{"code":"voice_not_found","statuses":[400,404],"meaning":"Голос не найден для движка","action":"Взять ID из списков голосов"},{"code":"voice_not_allowed","statuses":[400],"meaning":"Голос ElevenLabs не из списка стандартных","action":"Взять стандартный голос или клон Cartesia"},{"code":"invalid_model","statuses":[400],"meaning":"Модель не поддерживается или снята","action":"Взять модель из /v2/voices/models"},{"code":"unsupported_dub_language","statuses":[400],"meaning":"Язык дубляжа недоступен движку или модели","action":"Взять язык из `available`"},{"code":"dub_same_language","statuses":[400],"meaning":"Язык дубляжа совпадает с языком текста","action":"Убрать этот язык"},{"code":"unknown_dub_voice","statuses":[400],"meaning":"В `dub_voices` язык, которого нет в `dub_languages`","action":"Оставить только языки из `dub_languages`"},{"code":"subscription_required","statuses":[402],"meaning":"Нет подписки или пакета символов","action":"Купить пакет в боте"},{"code":"subscription_expired","statuses":[402],"meaning":"Безлимит закончился","action":"Продлить подписку в боте"},{"code":"insufficient_characters","statuses":[402],"meaning":"Не хватает символов (`required`, `available`)","action":"Пополнить баланс или сократить текст"},{"code":"user_blocked","statuses":[403],"meaning":"Пользователь заблокирован","action":"Написать в поддержку"},{"code":"engine_not_allowed","statuses":[403],"meaning":"Движок закрыт тарифом","action":"Сменить `engine` или тариф"},{"code":"clone_limit_reached","statuses":[403],"meaning":"Заняты все слоты своих клонов","action":"Удалить свой клон или клонировать по `elevenlabs_voice_id`"},{"code":"shared_clone","statuses":[403],"meaning":"Клон общего каталога","action":"Удалять нечего, слот он не занимает"},{"code":"task_not_found","statuses":[404],"meaning":"Задачи нет или она чужая","action":"Проверить `task_id` и токен"},{"code":"elevenlabs_voice_not_found","statuses":[404,422],"meaning":"Голоса нет в ElevenLabs","action":"Проверить ID через поиск"},{"code":"preview_not_found","statuses":[404],"meaning":"У голоса нет семпла","action":"Не показывать плеер"},{"code":"task_not_completed","statuses":[409],"meaning":"Задача ещё не `completed`","action":"Дождаться статуса"},{"code":"task_incomplete","statuses":[409],"meaning":"Готовы не все чанки (`missing`)","action":"Повторить через 10-60 секунд"},{"code":"task_not_ready","statuses":[409],"meaning":"Озвучка не закончена","action":"Дождаться статуса"},{"code":"no_timestamps","statuses":[409],"meaning":"У задачи нет меток ElevenLabs","action":"Использовать POST /v2/captions"},{"code":"already_processing","statuses":[409],"meaning":"Задача уже озвучивается","action":"Дождаться результата"},{"code":"already_cancelled","statuses":[409],"meaning":"Задача уже отменена","action":"Ничего"},{"code":"not_cancellable","statuses":[409],"meaning":"Статус не позволяет отменить","action":"Ничего"},{"code":"dub_track_not_cancellable","statuses":[409],"meaning":"Дорожка дубляжа отменяется с основной задачей","action":"Отменить задачу из `dub_of`"},{"code":"not_censored","statuses":[409],"meaning":"Повтор только для `censored`","action":"Проверить статус"},{"code":"retry_unavailable","statuses":[409],"meaning":"Нет данных для повтора","action":"Создать новую задачу"},{"code":"too_many_voices","statuses":[400],"meaning":"В диалоге больше 10 разных голосов","action":"Сократить число голосов"},{"code":"dialogues_closed","statuses":[403],"meaning":"Диалоги в закрытом тесте","action":"Дождаться открытого запуска"},{"code":"dialogues_disabled","statuses":[403],"meaning":"Диалоги отключены","action":"Повторить позже"},{"code":"retry_chunks_mismatch","statuses":[400],"meaning":"Индексы не совпали с `blocked_chunks`","action":"Прислать ровно `missing` без `unexpected`"},{"code":"duplicate_chunk_index","statuses":[400],"meaning":"Индекс повторяется","action":"Убрать дубли"},{"code":"result_expired","statuses":[410],"meaning":"Аудио удалено по сроку хранения","action":"Озвучить заново"},{"code":"invalid_download_link","statuses":[401],"meaning":"Подпись неверна или истекла","action":"Получить новую ссылку"},{"code":"clip_too_large","statuses":[413],"meaning":"Клип больше 16 МБ","action":"Сжать или обрезать"},{"code":"unsupported_format","statuses":[415],"meaning":"Формат клипа не поддерживается","action":"Конвертировать в mp3 или wav"},{"code":"clip_required","statuses":[422],"meaning":"Нет клипа и `elevenlabs_voice_id`","action":"Передать одно из двух"},{"code":"invalid_duration","statuses":[422],"meaning":"Клип не 10-60 секунд","action":"Обрезать или удлинить"},{"code":"invalid_audio","statuses":[422],"meaning":"Файл не читается как аудио","action":"Проверить файл"},{"code":"empty_clip","statuses":[422],"meaning":"Пустой клип","action":"Проверить файл"},{"code":"cartesia_rejected","statuses":[422],"meaning":"Cartesia не приняла клип","action":"Взять клип чище, без музыки"},{"code":"invalid_language","statuses":[422],"meaning":"Код языка не распознан","action":"Передать ISO 639-1 или `auto`"},{"code":"empty_audio","statuses":[400],"meaning":"Пустой файл","action":"Проверить файл"},{"code":"too_many_active_tasks","statuses":[429],"meaning":"Достигнут `max_parallel_tasks`","action":"Дождаться завершения задачи"},{"code":"too_many_generations","statuses":[429],"meaning":"Достигнут лимит потоков тарифа на ключе","action":"Дождаться завершения генерации"},{"code":"transcription_failed","statuses":[502],"meaning":"Речь не распознана","action":"Проверить аудио, указать `language`"},{"code":"cartesia_unavailable","statuses":[502],"meaning":"Cartesia не ответила","action":"Повторить через 10-60 секунд"},{"code":"transcription_timeout","statuses":[503],"meaning":"Распознавание не уложилось по времени","action":"Повторить через 10-60 секунд"},{"code":"queue_unavailable","statuses":[503],"meaning":"Очередь недоступна, символы возвращены","action":"Повторить через 10-60 секунд"},{"code":"generation_failed","statuses":[502],"meaning":"Генерация не принята или ответ битый","action":"Изменить запрос"},{"code":"no_proxy","statuses":[503],"meaning":"Нет канала до генерации","action":"Повторить через 10-60 секунд"},{"code":"elevenlabs_unavailable","statuses":[503],"meaning":"ElevenLabs не ответил","action":"Повторить через 10-60 секунд"},{"code":"no_account_available","statuses":[503],"meaning":"Нет свободного аккаунта провайдера","action":"Повторить через 10-60 секунд"},{"code":"download_signing_disabled","statuses":[503],"meaning":"Подписанные ссылки выключены","action":"Скачивать через /download"},{"code":"maintenance","statuses":[503],"meaning":"Технические работы","action":"Повторить позже, сообщение в `message`"}]}