{"format":"voicer-api-guide/1","title":"Voicer API v2","version":"2","language":"en","base_url":"https://voicer.mat3u.com","summary":"Text to speech with ElevenLabs and Cartesia voices, voice cloning, captions, music and sound effects.","conventions":{"auth":{"token":"Authorization: Bearer <token>","none":"no auth","signed":"exp and sig query signature, no token"},"markup":"`code` and [text](#anchor); the anchor is a section, topic, or endpoint id","error_body":{"detail":{"code":"string","message":"string"}}},"llm_notes":["Dialogues: POST /v2/dialogues with engine labs or cartesia; status and download work like tasks.","All paths are relative to base_url. Auth: Authorization: Bearer <token> header, except endpoints with auth = none or signed.","Errors: body {\"detail\": {\"code\", \"message\", ...}}; branch on code, list in error_codes. The message field is Russian in live API responses.","TTS is asynchronous: POST /v2/tasks, active GET /v2/tasks, poll GET /v2/tasks/{task_id} every 2-5 s until a terminal status, then GET /v2/tasks/{task_id}/download.","Python examples reuse python_preamble: a requests session s and BASE.","params[].default values are JSON literals.","Music and sound effects are synchronous and do not charge characters: POST /v2/music and POST /v2/sound-effects require an active subscription."],"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":"Getting started","intro":["Voicer API turns text into speech with ElevenLabs and Cartesia voices, clones voices, and builds captions. TTS is asynchronous: you create a task, poll its status, and download the MP3 when it is ready."],"topics":[{"id":"base-url","title":"Base URL and format","paragraphs":["Base URL: `https://voicer.mat3u.com`. All paths start with `/v2`. Requests and responses are JSON (UTF-8), except file uploads (`multipart/form-data`) and downloads of audio and captions.","Timestamps in responses are ISO 8601 with a UTC offset, for example `2026-10-11T16:34:08.984299Z`.","Paginated lists take `page` (zero-based) and `page_size` (1-50) and return `has_more`: while it is `true`, request the next page."],"table":null,"code":[]},{"id":"auth","title":"Authentication","paragraphs":["Every request except those marked as requiring no token sends an API token in `Authorization: Bearer <token>`. The token is issued by the Voicer Telegram bot. One token is one license: it has its own balance, tariff, and parallel-task limit.","A missing header or a bad token yields `401` with `WWW-Authenticate: Bearer`. To see who the token belongs to, call [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":"Error format","paragraphs":["A business-logic error comes with an HTTP status and a body `{\"detail\": {\"code\": \"...\", \"message\": \"...\"}}`. `code` is stable and is what clients should branch on; `message` is for humans and may change. Extra fields can sit next to them, for example `required` and `available` when characters run out. The full list is in [Error codes](#error-codes).","Auth errors are a string: `{\"detail\": \"Недействительный токен\"}`.","A wrong type or format yields `422` in the FastAPI list format: `{\"detail\": [{\"loc\": [\"body\", \"max_chunk_length\"], \"msg\": \"...\", \"type\": \"...\"}]}`. Extra fields in task JSON bodies are forbidden and also yield `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 quick start","paragraphs":["Full cycle: create a task, wait for the result, save the MP3. The other Python examples in this reference reuse session `s` and `BASE` from this snippet. You need the `requests` package and the `VOICER_TOKEN` environment variable."],"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        # Rewrite the blocked fragments and POST them to /retry (see Tasks).\n        raise RuntimeError(f\"Censored: {task['blocked_chunks']}\")\n    if task[\"status\"] != \"completed\":\n        raise RuntimeError(f\"Task {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":"Reference for an LLM","paragraphs":["The whole reference in machine-readable form is at [/docs.en.json](/docs.en.json): sections, endpoints, parameters with every value, curl and Python examples, errors, and gotchas. Pass the file to a model as context. OpenAPI for client generators: [/openapi.en.json](/openapi.en.json), interactive Swagger: [/docs/swagger](/docs/swagger)."],"table":null,"code":[]}],"endpoints":[],"nuances":[]},{"id":"concepts","title":"Core concepts","intro":[],"topics":[{"id":"engines","title":"TTS engines","paragraphs":["The task `engine` picks the provider. Allowed voices, models, and the maximum chunk size depend on it.","If `engine` is omitted, the API uses `original`, or `cartesia` on a tariff that does not allow original (Cartesia-only plans). An engine closed by the tariff yields `403` with `engine_not_allowed`. What your license allows is in `tariff` of [GET /v2/billing/me](#billing-me)."],"table":{"columns":["engine","Provider","Voices","Default model"],"rows":[["`original`","ElevenLabs","Standard ElevenLabs voices ([list](#voices-elevenlabs))","`eleven_multilingual_v2`"],["`cartesia`","Cartesia","Cartesia stock voices, your clones, and the shared clone catalog","`sonic-3.6`"]]},"code":[]},{"id":"characters","title":"Characters, packages, and the license","paragraphs":["TTS is billed in characters of the source text: `len(text)`, including spaces and newlines. Characters are charged when the task is created and refunded if you cancel before synthesis starts, if the task cannot be queued, or if synthesis ends with `failed`.","Characters live in packages, each with its own expiry. Charge comes from the package that expires first. On an unlimited subscription nothing is charged (`charged_characters = 0`), but tariff limits still apply.","Tariff limits: parallel tasks on the license (`max_parallel_tasks`), characters per task (`max_chars_per_task`), chunks per task (`max_chunks_per_task`), allowed engines, and your Cartesia clone quota (`max_cartesia_clones`). `null` in a limit means unlimited."],"table":null,"code":[]},{"id":"lifecycle","title":"Task lifecycle","paragraphs":["A task goes through `pending` (queued) and `processing` (synthesizing) and ends in a terminal status. Poll [GET /v2/tasks/{task_id}](#tasks-get) every 2-5 seconds."],"table":{"columns":["Status","Meaning","What to do"],"rows":[["`pending`","Queued, characters charged","Wait. You can cancel"],["`processing`","Synthesizing, `progress_percent` grows","Wait"],["`pending_confirmation`","Primary TTS has degraded; the task waits for an operator","Wait, the task will continue or finish on its own"],["`completed`","Done","Download the result"],["`censored`","ElevenLabs blocked some fragments; the rest is synthesized","Fix the text in `blocked_chunks` and call /retry"],["`failed`","Error, details in `error`; characters refunded","Create the task again"],["`cancelled`","Cancelled","Nothing"]]},"code":[]},{"id":"chunks","title":"Chunks","paragraphs":["Before synthesis the text is split into chunks, each is sent to the provider separately, then the chunks are concatenated into one MP3. `split_type` and `max_chunk_length` control the split. The chunk count is returned as `chunks_count` and is capped by the tariff.","Chunks also drive pauses (`auto_pause` inserts silence after every Nth chunk), `split_output` (a ZIP with one MP3 per chunk), and the censorship retry (only blocked chunks are resynthesized)."],"table":null,"code":[]}],"endpoints":[],"nuances":[]},{"id":"account","title":"Account and balance","intro":["Balance and limits are counted per license, that is per the token in the header. One user can have several tokens with different tariffs."],"topics":[],"endpoints":["auth-me","billing-me","billing-stats","billing-tariffs"],"nuances":["parallel-limit"]},{"id":"voices","title":"ElevenLabs voices and models","intro":["For `engine=original` only the standard ElevenLabs voices in the table below are accepted. The ElevenLabs library (search and featured) is how you find a voice to clone into Cartesia."],"topics":[{"id":"elevenlabs-voices-table","title":"Standard ElevenLabs voices","paragraphs":["All of these voices are multilingual and speak Russian on `eleven_multilingual_v2`, `eleven_v3`, and newer models."],"table":{"columns":["Name","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":"Models by engine","paragraphs":["Without `model_id` the default model is used. For `cartesia` an ElevenLabs model (`eleven_*`) is silently replaced with `sonic-3.6`, and retired models (`sonic`, `sonic-2*`, `sonic-turbo*`, `sonic-english`, and similar) yield `400` with `invalid_model`. Dated snapshots such as `sonic-3.6-YYYY-MM-DD` are accepted."],"table":{"columns":["Engine","Default","Others"],"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 voices","intro":["For `engine=cartesia` three kinds of voices work: Cartesia stock voices, your clones, and the shared catalog of ElevenLabs clones. Every list requires a tariff that allows the cartesia engine."],"topics":[{"id":"cartesia-voice-kinds","title":"Which voice_id to send in a task","paragraphs":["In `voice_id` of a task with `engine=cartesia` you can pass any of the three IDs. If you pass an ElevenLabs voice ID, the service finds its ready clone: yours first, then the shared catalog."],"table":{"columns":["What you pass","Example","Where to get it"],"rows":[["Cartesia clone ID","`8d0a6f1e-3b52-4c9e-a7d4-52e1c09b7f36`","Catalog, my clones, /clone response"],["Stock voice ID","`f786b574-daa5-4673-aa0c-cbe3e8534c02`","/v2/voices/cartesia/standard"],["ElevenLabs voice ID that already has a clone","`Wu3B7bOkdHbKnJTvbiFk`","ElevenLabs search, then /clone or /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":"Voice cloning","intro":["A Cartesia clone is created in two ways, and they spend the tariff quota (`max_cartesia_clones`) differently."],"topics":[{"id":"clone-kinds","title":"Your clone vs a clone from ElevenLabs","paragraphs":[],"table":{"columns":["","Your clip","elevenlabs_voice_id"],"rows":[["Clone slot","Uses one","Does not use one"],["Who can see it","Only you","Everyone, goes into the shared catalog"],["Audio","Required, 10-60 s","Optional: the ElevenLabs sample is used"],["Repeat","A new clone every time","Returns the existing one (`reused: true`)"],["Delete","DELETE frees the slot","Forbidden (`403 shared_clone`)"]]},"code":[]}],"endpoints":["cartesia-clone","cartesia-from-labs","cartesia-delete"],"nuances":["labs-clone-slots","clone-slots-count","clone-languages"]},{"id":"tasks","title":"TTS tasks","intro":["A task belongs to the license (token) that created it. Other people's tasks do not exist for the API and yield `404`. Unfinished tasks of this key: [GET /v2/tasks](#tasks-list)."],"topics":[{"id":"censorship","title":"Censorship and retry","paragraphs":["ElevenLabs sometimes refuses to synthesize individual fragments. The task then ends as `censored`: synthesized chunks are kept, and the blocked ones are listed in `blocked_chunks`. Rewrite their text and POST it to [/retry](#tasks-retry): only those chunks are resynthesized.","A retry is free if the new text is not longer than the original. If it is longer, only the difference is charged. With no extra charge the retry works even after the subscription ends. Retry data is stored with the task (30 days)."],"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: your wording\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    # then poll the status again until completed\n","title":"Retry in Python"}]},{"id":"dubbing","title":"Dubbing","paragraphs":["With `dub_languages` the task speaks the text, then translates it into each language and speaks the translation. By default it uses the same voice (Cartesia uses a clone in the track language); `dub_voices` sets another `voice_id` per language so the translation has no accent. The translation is fitted to the duration of every original chunk: if it comes out longer, the model shortens the wording instead of speeding up the speech. At the end, the chunks of all tracks are padded with silence to the longest one, so the files have the same length and fit one video.","Example: the original uses `JBFqnCBsd6RMkjVDRZzb`, English uses `pNInz6obpgDQGcFmaJgB`, German uses `EXAVITQu4vr4xnSDxMaL`. A language with no key in `dub_voices` keeps the original voice (Cartesia uses a clone in the track language).","The whole original is spoken first, then the languages one by one. Each track's progress is in `dubs` of the main task. The main task and its tracks become `completed` together, once the lengths are aligned.","Each track has its own `task_id`: [/download](#tasks-download), [/subtitles](#tasks-subtitles) and [/v2/captions](#captions-create) treat it as a regular task. For `engine=original` the tracks have ElevenLabs timestamps: captions are instant and match the aligned audio. For Cartesia, captions come from speech recognition via /v2/captions.","Cost: text length × (1 + 1.5 × number of languages), charged to the main task on create. If dubbing ends as `failed`, characters are refunded. A track cannot be cancelled on its own, only with the main task.","Languages depend on the engine and model. Eleven v3 and v4 speak every dubbing language, Multilingual v2, Flash v2.5 and Turbo v2.5 have their own list, Cartesia uses the Sonic languages. An unavailable language yields `400 unsupported_dub_language` with the `available` list. For Cartesia the dubbing language cannot equal the text `language`."],"table":null,"code":[{"language":"python","code":"import time\nfrom pathlib import Path\n\nbody = {\n    \"text\": text,\n    \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\",  # original: George\n    \"model_id\": \"eleven_v3\",\n    \"dub_languages\": [\"en\", \"de\"],\n    \"dub_voices\": {\n        \"en\": \"pNInz6obpgDQGcFmaJgB\",  # English: Adam, not the original voice\n        \"de\": \"EXAVITQu4vr4xnSDxMaL\",  # German: 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# every track's audio and timestamps are kept for an hour after the last language\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 has no timestamps: 409, use POST /v2/captions\n        Path(f\"{name}.srt\").write_bytes(srt.content)\n","title":"Dubbing in Python: every file and its captions"}]}],"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":"Dialogues","intro":["A dialogue is a regular TTS task made of lines spoken by different voices. Status, download and cancellation go through the task endpoints, and characters are charged exactly like a regular task of the same length."],"topics":[{"id":"dialogue-engines","title":"Engines and voices","paragraphs":["`labs` synthesizes the dialogue through ElevenLabs text-to-dialogue. Voices are standard ElevenLabs voices, and audio tags such as `[excited]` and `[laughs]` are acted out by the model. The default model is `eleven_v4`; `eleven_v4_turbo` and `eleven_v3` are also available.","`cartesia` synthesizes every line with its own Cartesia TTS request and concatenates them. A line voice is a clone ID, a Cartesia stock voice, or an ElevenLabs voice ID that already has a clone. The language picks the clone: if there is no clone in the text language, Slavic languages fall back to the voice's `ru` clone and everything else to the `en` clone, while the synthesis language stays the text language. Cartesia stock voices have a fixed language and read text in another language with an accent. Cartesia understands laughter and emotion tags; other tags are stripped.","A long dialogue is split into parts: up to 1000 characters per request for `labs` and 500 for `cartesia`, without breaking lines unnecessarily. A dialogue has at most 10 different voices. Dialogues have no captions: the provider response carries no timestamps."],"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":"Wait for the result"}]},{"id":"dialogue-text","title":"How to write the text","paragraphs":["In `text` a line starts with a row `[voice_id]: text`. The `voice_id` is the same voice ID as in a regular task. A row without a mark at the start continues the previous line, so a line can span several rows. Blank rows at the start of the text are skipped."],"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":"The whole dialogue text"}]}],"endpoints":["dialogues-create"],"nuances":["dialogue-retry"]},{"id":"results","title":"Result","intro":["You can download only a `completed` task. Audio is kept for a limited time after completion, then deleted, and /download responds `410 result_expired`. Download as soon as the task is ready."],"topics":[],"endpoints":["tasks-download","tasks-download-link","tasks-file"],"nuances":["split-output","download-first","result-retention"]},{"id":"subtitles","title":"Captions","intro":["There are two ways to get captions for a TTS result. They differ in speed and in which engines they work for."],"topics":[{"id":"subtitles-choice","title":"Which method to pick","paragraphs":["A reliable strategy: try /subtitles first, and on `409 no_timestamps` fall back to /v2/captions."],"table":{"columns":["","/v2/tasks/{task_id}/subtitles","/v2/captions"],"rows":[["Source","ElevenLabs timestamps from synthesis","Speech recognition"],["Engines","`original` only","Any, including `cartesia`"],["Speed","Instant","Seconds or minutes"],["Formats","`srt`, `vtt`, `json`","`srt`, `vtt`"],["Task status","`completed` or `censored`","Finished audio"]]},"code":[]}],"endpoints":["tasks-subtitles","captions-create","captions-upload"],"nuances":["auto-pause","split-output","result-retention","cartesia-subtitles"]},{"id":"studio","title":"Music and sound effects","intro":["Music and short sounds. Both methods are synchronous, with no task queue and no character charge. An active subscription is required."],"topics":[],"endpoints":["studio-music","studio-sound"],"nuances":["studio-subscription"]},{"id":"error-codes","title":"Error codes","intro":["The `detail.code` value in an error response. Branch client logic on the code, not on the `message` text. `401` responses without a code and `422` validation are described in [Error format](#errors-format)."],"topics":[],"endpoints":[],"nuances":[]}],"endpoints":[{"id":"auth-me","method":"GET","path":"/v2/auth/me","title":"Who this token belongs to","summary":"Returns the user and license that own the token. Useful to validate the token when a client starts.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"user_id","type":"string","description":"User ID"},{"name":"token_id","type":"integer","description":"License ID (API token)"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"}],"examples":[{"title":"Check the token","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":"License balance and tariff","summary":"Subscription, tariff, and remaining characters of the license from the Authorization header. Before a large task check `remaining_characters` and the `tariff` limits.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"user_id","type":"string","description":"User ID"},{"name":"user_active","type":"boolean","description":"`false`: the user is blocked"},{"name":"token_id","type":"integer | null","description":"License whose balance was computed"},{"name":"subscription_type","type":"string","description":"`characters`, `unlimited`, or `no_subscription`"},{"name":"subscription_expires_at","type":"datetime | null","description":"End of the unlimited subscription"},{"name":"subscription_active","type":"boolean","description":"Whether tasks can be created now (subscription and balance)"},{"name":"total_characters","type":"integer","description":"Granted in active packages"},{"name":"used_characters","type":"integer","description":"Charged from active packages"},{"name":"remaining_characters","type":"integer","description":"Remainder"},{"name":"tariff","type":"object | null","description":"Tariff limits, same as /v2/billing/tariffs"},{"name":"packages","type":"array","description":"Active packages with remainder, in charge order, each with its own expiry"},{"name":"tariff_code","type":"string | null","description":"Tariff code"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":404,"code":null,"when":"The user for this token was not found"}],"examples":[{"title":"Character package","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: balance, tasks, clones","summary":"License balance, task counters, and used Cartesia clone quota in one request.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"subscription_type","type":"string","description":"`characters`, `unlimited`, or `no_subscription`"},{"name":"subscription_expires_at","type":"datetime | null","description":"End of the unlimited subscription"},{"name":"subscription_active","type":"boolean","description":"Whether tasks can be created now (subscription and balance)"},{"name":"total_characters","type":"integer","description":"Granted in active packages"},{"name":"used_characters","type":"integer","description":"Charged from active packages"},{"name":"remaining_characters","type":"integer","description":"Remainder"},{"name":"tariff","type":"object | null","description":"Tariff limits, same as /v2/billing/tariffs"},{"name":"packages","type":"array","description":"Active packages with remainder, in charge order, each with its own expiry"},{"name":"total_tasks","type":"integer","description":"Tasks in total"},{"name":"completed_tasks","type":"integer","description":"Completed"},{"name":"active_tasks","type":"integer","description":"Queued or running now"},{"name":"clones_used","type":"integer","description":"Your Cartesia clones (count toward the quota)"},{"name":"clones_limit","type":"integer | null","description":"Clone quota, `null` for unlimited"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":404,"code":null,"when":"The user for this token was not found"}],"examples":[{"title":"Summary","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":"Tariffs","summary":"Active tariffs and their limits. Packages and subscriptions are bought in the Telegram bot.","auth":"none","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"code","type":"string","description":"Tariff code"},{"name":"kind","type":"string","description":"`package` (character pack) or `subscription`"},{"name":"max_parallel_tasks","type":"integer","description":"Parallel tasks on the license"},{"name":"threads_per_task","type":"integer","description":"Parallel synthesis threads of one task"},{"name":"max_chunks_per_task","type":"integer | null","description":"Chunk cap per task"},{"name":"max_chars_per_task","type":"integer | null","description":"Character cap per task"},{"name":"allow_original","type":"boolean","description":"`original` engine (ElevenLabs) is allowed"},{"name":"allow_cartesia","type":"boolean","description":"`cartesia` engine is allowed"},{"name":"max_cartesia_clones","type":"integer | null","description":"Your clone quota: `0` forbidden, `null` unlimited"}],"errors":[],"examples":[{"title":"List tariffs","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":"Standard ElevenLabs voices","summary":"Voices accepted by a task with `engine=original`. The list is static, sorted by name.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"[].voice_id","type":"string","description":"Value for the task `voice_id`"},{"name":"[].name","type":"string","description":"Voice name"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"}],"examples":[{"title":"List","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":"Search the ElevenLabs library","summary":"Free voices from the public ElevenLabs library by name, description, or ID. This is a source for [cloning into Cartesia](#cartesia-clone).","auth":"token","params":[{"name":"q","where":"query","type":"string","description":"Name, description, or voice ID. If it looks like an ID, that voice is listed first","required":true,"default":null,"constraints":"1-100 characters, not whitespace only","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"query","type":"string","description":"The query as the server understood it"},{"name":"items","type":"array","description":"Voices: ID match first, then by name"},{"name":"items[].voice_id","type":"string","description":"ElevenLabs voice ID: suitable for cloning"},{"name":"items[].name","type":"string","description":"Name"},{"name":"items[].source","type":"string","description":"`account` found by ID on the account, `library` the public library"},{"name":"items[].language, accent, gender, age, use_case","type":"string | null","description":"Voice labels"},{"name":"items[].preview_url","type":"string | null","description":"Public ElevenLabs sample"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs did not respond, retry later"}],"examples":[{"title":"Search by name","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":["Library voices cannot be passed straight into a task with `engine=original`: the service accepts only [standard voices](#voices-elevenlabs). To speak with a library voice, clone it into Cartesia with `elevenlabs_voice_id`."],"section":"voices","anchor":"#voices-elevenlabs-search"},{"id":"voices-elevenlabs-featured","method":"GET","path":"/v2/voices/elevenlabs/featured","title":"Featured Russian ElevenLabs voices","summary":"Free high-quality Russian library voices, newest first. The response is cached for a few minutes.","auth":"token","params":[{"name":"page","where":"query","type":"integer","description":"Page number, zero-based","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Page size","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Voices, same fields as search"},{"name":"page, page_size","type":"integer","description":"Requested page"},{"name":"has_more","type":"boolean","description":"There is a next page"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs did not respond, retry later"}],"examples":[{"title":"First page of 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":"Models","summary":"Allowed `model_id` values per engine. The default model comes first and is marked `default: true`.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"elevenlabs","type":"array","description":"Models for `engine=original`"},{"name":"cartesia","type":"array","description":"Models for `engine=cartesia`"},{"name":"*[].model_id","type":"string","description":"Value for the task `model_id`"},{"name":"*[].default","type":"boolean","description":"Default model"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"}],"examples":[{"title":"Models","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":"Your clones and the shared catalog","summary":"Your clones and the shared ElevenLabs clone catalog in one list.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Language filter: a Cartesia code (`ru`, `de`, `uk`). Empty: any language","required":false,"default":null,"constraints":"up to 16 characters","values":[],"fields":[]},{"name":"source","where":"query","type":"string","description":"Only one source; omit for both","required":false,"default":null,"constraints":null,"values":[{"value":"user","description":"Your clones"},{"value":"elevenlabs","description":"Shared catalog of ElevenLabs voice clones"}],"fields":[]},{"name":"q","where":"query","type":"string","description":"Search by name and ID","required":false,"default":null,"constraints":"up to 100 characters","values":[],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Page number, zero-based","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Page size","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Voices, fields below"},{"name":"total","type":"integer","description":"Total voices matching the filter"},{"name":"page, page_size","type":"integer","description":"Requested page"},{"name":"has_more","type":"boolean","description":"There is a next page"},{"name":"items[].voice_id","type":"string","description":"ID for `voice_id` in a task with `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Voice labels"},{"name":"items[].language","type":"string | null","description":"Voice language; a clone keeps its Cartesia language code"},{"name":"items[].accent","type":"string | null","description":"Accent"},{"name":"items[].gender","type":"string | null","description":"Gender, standard voices only"},{"name":"items[].source","type":"string","description":"`standard` Cartesia library, `elevenlabs` shared clone catalog, `user` your clone"},{"name":"items[].preview_url","type":"string | null","description":"Sample for a player, no token required"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Source ElevenLabs voice for a clone"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Whether the source ElevenLabs voice is paid"},{"name":"items[].is_owner","type":"boolean","description":"This is your clone"},{"name":"items[].created_at","type":"datetime | null","description":"When the clone was created"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":403,"code":"engine_not_allowed","when":"The tariff does not allow the cartesia engine"},{"status":403,"code":"user_blocked","when":"The user is blocked"}],"examples":[{"title":"Russian voices from both sources","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":"Shared clone catalog","summary":"Clones of ElevenLabs voices available to every user. You can synthesize with them without using your clone slots.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Language filter: a Cartesia code (`ru`, `de`, `uk`). Empty: any language","required":false,"default":null,"constraints":"up to 16 characters","values":[],"fields":[]},{"name":"paid","where":"query","type":"boolean","description":"Filter by the source ElevenLabs voice; omit for all","required":false,"default":null,"constraints":null,"values":[{"value":"true","description":"Clones of paid ElevenLabs voices"},{"value":"false","description":"Clones of free voices"}],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Page number, zero-based","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Page size","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Voices, fields below"},{"name":"total","type":"integer","description":"Total voices matching the filter"},{"name":"page, page_size","type":"integer","description":"Requested page"},{"name":"has_more","type":"boolean","description":"There is a next page"},{"name":"items[].voice_id","type":"string","description":"ID for `voice_id` in a task with `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Voice labels"},{"name":"items[].language","type":"string | null","description":"Voice language; a clone keeps its Cartesia language code"},{"name":"items[].accent","type":"string | null","description":"Accent"},{"name":"items[].gender","type":"string | null","description":"Gender, standard voices only"},{"name":"items[].source","type":"string","description":"`standard` Cartesia library, `elevenlabs` shared clone catalog, `user` your clone"},{"name":"items[].preview_url","type":"string | null","description":"Sample for a player, no token required"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Source ElevenLabs voice for a clone"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Whether the source ElevenLabs voice is paid"},{"name":"items[].is_owner","type":"boolean","description":"This is your clone"},{"name":"items[].created_at","type":"datetime | null","description":"When the clone was created"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":403,"code":"engine_not_allowed","when":"The tariff does not allow the cartesia engine"},{"status":403,"code":"user_blocked","when":"The user is blocked"}],"examples":[{"title":"Catalog in Russian","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":"My clones and quota","summary":"Your clones only, and how many clone slots are used.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Language filter: a Cartesia code (`ru`, `de`, `uk`). Empty: any language","required":false,"default":null,"constraints":"up to 16 characters","values":[],"fields":[]},{"name":"q","where":"query","type":"string","description":"Search by name and ID","required":false,"default":null,"constraints":"up to 100 characters","values":[],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Page number, zero-based","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Page size","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Voices, fields below"},{"name":"total","type":"integer","description":"Total voices matching the filter"},{"name":"page, page_size","type":"integer","description":"Requested page"},{"name":"has_more","type":"boolean","description":"There is a next page"},{"name":"clones_used","type":"integer","description":"Your clones in any status (count toward the quota)"},{"name":"clones_limit","type":"integer | null","description":"Tariff quota: `null` unlimited, `0` forbidden"},{"name":"items[].voice_id","type":"string","description":"ID for `voice_id` in a task with `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Voice labels"},{"name":"items[].language","type":"string | null","description":"Voice language; a clone keeps its Cartesia language code"},{"name":"items[].accent","type":"string | null","description":"Accent"},{"name":"items[].gender","type":"string | null","description":"Gender, standard voices only"},{"name":"items[].source","type":"string","description":"`standard` Cartesia library, `elevenlabs` shared clone catalog, `user` your clone"},{"name":"items[].preview_url","type":"string | null","description":"Sample for a player, no token required"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Source ElevenLabs voice for a clone"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Whether the source ElevenLabs voice is paid"},{"name":"items[].is_owner","type":"boolean","description":"This is your clone"},{"name":"items[].created_at","type":"datetime | null","description":"When the clone was created"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":403,"code":"engine_not_allowed","when":"The tariff does not allow the cartesia engine"},{"status":403,"code":"user_blocked","when":"The user is blocked"}],"examples":[{"title":"My clones","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 stock voices","summary":"Library of ready Cartesia voices. Clone slots are not needed.","auth":"token","params":[{"name":"language","where":"query","type":"string","description":"Language filter: a Cartesia code (`ru`, `de`, `uk`). Empty: any language","required":false,"default":null,"constraints":"up to 16 characters","values":[],"fields":[]},{"name":"gender","where":"query","type":"string","description":"Filter by gender","required":false,"default":null,"constraints":null,"values":[{"value":"masculine","description":"Male"},{"value":"feminine","description":"Female"},{"value":"gender_neutral","description":"Neutral"}],"fields":[]},{"name":"q","where":"query","type":"string","description":"Search by name and description","required":false,"default":null,"constraints":"up to 100 characters","values":[],"fields":[]},{"name":"page","where":"query","type":"integer","description":"Page number, zero-based","required":false,"default":"0","constraints":"0-10000","values":[],"fields":[]},{"name":"page_size","where":"query","type":"integer","description":"Page size","required":false,"default":"50","constraints":"1-50","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"items","type":"array","description":"Voices, fields below"},{"name":"total","type":"integer","description":"Total voices matching the filter"},{"name":"page, page_size","type":"integer","description":"Requested page"},{"name":"has_more","type":"boolean","description":"There is a next page"},{"name":"items[].voice_id","type":"string","description":"ID for `voice_id` in a task with `engine=cartesia`"},{"name":"items[].name, tagline, description","type":"string | null","description":"Voice labels"},{"name":"items[].language","type":"string | null","description":"Voice language; a clone keeps its Cartesia language code"},{"name":"items[].accent","type":"string | null","description":"Accent"},{"name":"items[].gender","type":"string | null","description":"Gender, standard voices only"},{"name":"items[].source","type":"string","description":"`standard` Cartesia library, `elevenlabs` shared clone catalog, `user` your clone"},{"name":"items[].preview_url","type":"string | null","description":"Sample for a player, no token required"},{"name":"items[].elevenlabs_voice_id","type":"string | null","description":"Source ElevenLabs voice for a clone"},{"name":"items[].labs_is_paid","type":"boolean | null","description":"Whether the source ElevenLabs voice is paid"},{"name":"items[].is_owner","type":"boolean","description":"This is your clone"},{"name":"items[].created_at","type":"datetime | null","description":"When the clone was created"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":403,"code":"engine_not_allowed","when":"The tariff does not allow the cartesia engine"},{"status":403,"code":"user_blocked","when":"The user is blocked"}],"examples":[{"title":"Female Russian voices","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 voice card","summary":"Your clone, a catalog clone, or a stock voice by ID.","auth":"token","params":[{"name":"voice_id","where":"path","type":"string","description":"Voice 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 for `voice_id` in a task with `engine=cartesia`"},{"name":"name, tagline, description","type":"string | null","description":"Voice labels"},{"name":"language","type":"string | null","description":"Voice language; a clone keeps its Cartesia language code"},{"name":"accent","type":"string | null","description":"Accent"},{"name":"gender","type":"string | null","description":"Gender, standard voices only"},{"name":"source","type":"string","description":"`standard` Cartesia library, `elevenlabs` shared clone catalog, `user` your clone"},{"name":"preview_url","type":"string | null","description":"Sample for a player, no token required"},{"name":"elevenlabs_voice_id","type":"string | null","description":"Source ElevenLabs voice for a clone"},{"name":"labs_is_paid","type":"boolean | null","description":"Whether the source ElevenLabs voice is paid"},{"name":"is_owner","type":"boolean","description":"This is your clone"},{"name":"created_at","type":"datetime | null","description":"When the clone was created"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":403,"code":"engine_not_allowed","when":"The tariff does not allow the cartesia engine"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":404,"code":"voice_not_found","when":"The voice is missing or it is someone else's clone"}],"examples":[{"title":"Catalog clone","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":"Stock voice sample","summary":"MP3 sample of a Cartesia stock voice. The `preview_url` from the catalog can go into `<audio>` as-is: no token, the response is cached for 7 days and open for CORS.","auth":"none","params":[{"name":"voice_id","where":"path","type":"string","description":"Stock voice 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":"The voice has no sample"},{"status":502,"code":"cartesia_unavailable","when":"Cartesia did not respond or refused"},{"status":503,"code":"no_account_available","when":"No working Cartesia account, retry later"}],"examples":[{"title":"Download the sample","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":"Clone a voice","summary":"Creates a Cartesia clone from your audio or from an ElevenLabs voice. The request is synchronous and can take several minutes: set a client timeout of at least 300 seconds.","auth":"token","params":[{"name":"language","where":"form","type":"string","description":"Clone language: a Cartesia code (`ru`, `en`, `de`, `uk`, and others). An unsupported Slavic code produces a ru clone, any other unknown code an en clone","required":true,"default":null,"constraints":"up to 16 characters","values":[],"fields":[]},{"name":"clip","where":"form","type":"file","description":"Speech audio. Required without `elevenlabs_voice_id`; optional with it (the ElevenLabs sample is used)","required":false,"default":null,"constraints":"10-60 seconds, up to 16 MB; flac, mp3, mpeg, mpga, oga, ogg, wav, webm","values":[],"fields":[]},{"name":"elevenlabs_voice_id","where":"form","type":"string","description":"ElevenLabs voice. With it the clone goes into the shared catalog and does not use your slot","required":false,"default":null,"constraints":"10-64 Latin letters and digits","values":[],"fields":[]},{"name":"name","where":"form","type":"string","description":"Clone name. Defaults to the ElevenLabs voice name or `clone-ru`/`clone-en`","required":false,"default":null,"constraints":"up to 255 characters","values":[],"fields":[]},{"name":"mode","where":"form","type":"string","description":"Cartesia cloning mode","required":false,"default":"\"similarity\"","constraints":null,"values":[{"value":"similarity","description":"As close to the source as possible"},{"value":"stability","description":"More stable sound, fewer source artifacts"}],"fields":[]},{"name":"tagline","where":"form","type":"string","description":"Short label","required":false,"default":null,"constraints":"up to 32 characters","values":[],"fields":[]},{"name":"description","where":"form","type":"string","description":"Description. Defaults to the ElevenLabs voice description","required":false,"default":null,"constraints":"up to 1000 characters","values":[],"fields":[]},{"name":"accent","where":"form","type":"string","description":"Accent","required":false,"default":null,"constraints":"up to 64 characters","values":[],"fields":[]}],"content_type":"multipart/form-data","response_type":"application/json","response":[{"name":"voice","type":"object","description":"The clone, same fields as the voice card"},{"name":"reused","type":"boolean","description":"`true`: a ready clone of this voice was already in the catalog"},{"name":"clones_used","type":"integer","description":"Your clones after the operation"},{"name":"clones_limit","type":"integer | null","description":"Your clone quota, `null` unlimited"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":403,"code":"engine_not_allowed","when":"The tariff does not allow the cartesia engine"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":403,"code":"clone_limit_reached","when":"All of your clone slots are used"},{"status":413,"code":"clip_too_large","when":"The file is larger than 16 MB"},{"status":415,"code":"unsupported_format","when":"The file format is not supported"},{"status":422,"code":"clip_required","when":"Neither `clip` nor `elevenlabs_voice_id` was sent"},{"status":422,"code":"invalid_duration","when":"Audio length is not 10-60 seconds"},{"status":422,"code":"invalid_audio","when":"The file cannot be read as audio"},{"status":422,"code":"empty_clip","when":"Empty file"},{"status":422,"code":"elevenlabs_voice_not_found","when":"The voice is not in ElevenLabs"},{"status":422,"code":"cartesia_rejected","when":"Cartesia rejected the clip"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs did not respond, retry later"},{"status":502,"code":"cartesia_unavailable","when":"Cartesia did not respond or refused"},{"status":503,"code":"no_account_available","when":"No working Cartesia account, retry later"}],"examples":[{"title":"Your clone from a file (uses a slot)","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":"Clone of an ElevenLabs voice (does not use a slot)","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":["Cloning the same ElevenLabs voice in the same language again does not create a new clone: the existing one is returned with `reused: true`. You can check first with [/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":"Check an ElevenLabs voice before cloning","summary":"Whether the voice exists in ElevenLabs, whether its clone is already in the shared catalog, and whether you have one. Creates nothing.","auth":"token","params":[{"name":"voice_id","where":"path","type":"string","description":"ElevenLabs voice ID","required":true,"default":null,"constraints":"10-64 Latin letters and digits","values":[],"fields":[]},{"name":"language","where":"query","type":"string","description":"Clone language: a Cartesia code (same as /clone); empty: a clone in any language","required":false,"default":null,"constraints":"up to 16 characters","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"elevenlabs_voice_id","type":"string","description":"ElevenLabs voice ID"},{"name":"name","type":"string | null","description":"Name"},{"name":"preview_url","type":"string | null","description":"ElevenLabs sample"},{"name":"labs_is_paid","type":"boolean | null","description":"The voice is paid in ElevenLabs"},{"name":"clone_language","type":"string | null","description":"Clone language code, or `null`"},{"name":"can_clone","type":"boolean","description":"There is not yet a clone in the shared catalog"},{"name":"catalog","type":"object | null","description":"Ready clone in the shared catalog"},{"name":"mine","type":"object | null","description":"Your clone of this voice"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":403,"code":"engine_not_allowed","when":"The tariff does not allow the cartesia engine"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":404,"code":"elevenlabs_voice_not_found","when":"The voice is not in ElevenLabs"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs did not respond, retry later"}],"examples":[{"title":"The clone is already in the catalog","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":"Delete your clone","summary":"Deletes the clone in Cartesia and frees the slot. Shared-catalog clones cannot be deleted.","auth":"token","params":[{"name":"voice_id","where":"path","type":"string","description":"Your clone ID","required":true,"default":null,"constraints":"1-64","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"voice_id","type":"string","description":"Deleted clone"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":403,"code":"shared_clone","when":"This is a shared-catalog clone"},{"status":404,"code":"voice_not_found","when":"The clone is missing or it is someone else's"},{"status":502,"code":"cartesia_unavailable","when":"Cartesia did not respond or refused"},{"status":503,"code":"no_account_available","when":"No working Cartesia account, retry later"}],"examples":[{"title":"Delete","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":"Create a TTS task","summary":"Queues the text and charges characters immediately. Responds `202` with `task_id`; wait for the result via [GET /v2/tasks/{task_id}](#tasks-get).","auth":"token","params":[{"name":"text","where":"body","type":"string","description":"Text to synthesize. Its length in characters is the task cost","required":true,"default":null,"constraints":"1-1 000 000 characters and no more than the tariff `max_chars_per_task`","values":[],"fields":[]},{"name":"voice_id","where":"body","type":"string","description":"Voice. For `original`, a standard ElevenLabs voice ID; for `cartesia`, a clone ID, a Cartesia stock voice ID, or an ElevenLabs voice that already has a clone","required":true,"default":null,"constraints":"1-50 characters","values":[],"fields":[]},{"name":"engine","where":"body","type":"string","description":"Engine. If omitted: `original` when the tariff allows it, otherwise `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":"Model. If omitted: `eleven_multilingual_v2` or `sonic-3.6`. List at [/v2/voices/models](#voices-models)","required":false,"default":null,"constraints":"up to 50 characters","values":[],"fields":[]},{"name":"language","where":"body","type":"string","description":"Text language, `cartesia` only: picks the clone of that language and the synthesis language. If omitted: the voice language","required":false,"default":null,"constraints":"up to 16 characters, for example `ru`, `en`, `de`","values":[],"fields":[]},{"name":"dub_languages","where":"body","type":"array","description":"Dubbing: languages to translate the text into. Each language is spoken as a separate track; chunks of all tracks are padded with silence to the longest one, so the files match the original in length. The default voice is the original (Cartesia uses a clone in the track language). A different voice per language goes in `dub_voices`. Cost: text × (1 + 1.5 × languages)","required":false,"default":null,"constraints":"codes from the engine catalog, for example `en`, `de`, `es`; duplicates are dropped","values":[],"fields":[]},{"name":"dub_voices","where":"body","type":"object","description":"Track voice: an object `{language code: voice_id}`. For example `{\"en\": \"pNInz6obpgDQGcFmaJgB\", \"de\": \"EXAVITQu4vr4xnSDxMaL\"}`: English and German with their own voices. The key must be in `dub_languages`. If omitted: Labs speaks with the original voice, Cartesia uses a clone in the track language","required":false,"default":null,"constraints":"the same `voice_id` as in a task; a key outside `dub_languages` yields `400 unknown_dub_voice`","values":[],"fields":[]},{"name":"voice_settings","where":"body","type":"object","description":"ElevenLabs voice settings. Cartesia ignores them. Omitted fields use ElevenLabs defaults","required":false,"default":null,"constraints":null,"values":[],"fields":[{"name":"stability","where":"body","type":"number","description":"Intonation stability","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]},{"name":"similarity_boost","where":"body","type":"number","description":"Likeness to the source voice","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]},{"name":"style","where":"body","type":"number","description":"Style exaggeration","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]},{"name":"use_speaker_boost","where":"body","type":"boolean","description":"Boost likeness to the speaker","required":false,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"speed","where":"body","type":"number","description":"Speech rate","required":false,"default":null,"constraints":"0.7-1.2","values":[],"fields":[]}]},{"name":"split_type","where":"body","type":"string","description":"How to split the text into chunks","required":false,"default":"\"smart\"","constraints":null,"values":[{"value":"smart","description":"By sentences glued up to `max_chunk_length`; quotes and direct speech are not split"},{"value":"paragraphs","description":"Each non-empty line is a chunk; `max_chunk_length` is ignored, a line longer than 2500 characters yields `400 invalid_split`"},{"value":"max_length","description":"By sentences up to `max_chunk_length`, ignoring quotes"}],"fields":[]},{"name":"max_chunk_length","where":"body","type":"integer","description":"Maximum chunk length. For `cartesia` (except `paragraphs`) and for Chinese, Japanese, and Korean text it is capped at 500","required":false,"default":"1000","constraints":"500-2500","values":[],"fields":[]},{"name":"split_output","where":"body","type":"boolean","description":"`true`: the result is a ZIP with one MP3 per chunk instead of a single MP3","required":false,"default":"false","constraints":null,"values":[],"fields":[]},{"name":"auto_pause","where":"body","type":"object","description":"Silence after every `frequency`-th chunk. There is no pause after the last chunk","required":false,"default":null,"constraints":null,"values":[],"fields":[{"name":"enabled","where":"body","type":"boolean","description":"Turn pauses on","required":false,"default":"false","constraints":null,"values":[],"fields":[]},{"name":"duration","where":"body","type":"number","description":"Pause length in seconds","required":false,"default":"0.5","constraints":"0.1-30","values":[],"fields":[]},{"name":"frequency","where":"body","type":"integer","description":"Pause after every Nth chunk","required":false,"default":"1","constraints":"1-100","values":[],"fields":[]}]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"task_id","type":"string","description":"Task ID"},{"name":"status","type":"string","description":"Always `pending`"},{"name":"engine","type":"string","description":"Chosen engine"},{"name":"voice_id","type":"string","description":"Voice the provider will get (for Cartesia, the clone ID)"},{"name":"model_id","type":"string","description":"Chosen model"},{"name":"chunks_count","type":"integer","description":"How many chunks the text was split into"},{"name":"characters","type":"integer","description":"Text length"},{"name":"charged_characters","type":"integer","description":"Characters charged; `0` on unlimited"},{"name":"dubs","type":"array | null","description":"With `dub_languages`: `[{language, task_id, status, progress_percent, voice_id}]`, each track has its own `task_id` for status and download"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":400,"code":"empty_text","when":"The text has nothing that can be spoken"},{"status":400,"code":"text_too_long","when":"The text is longer than the tariff `max_chars_per_task`"},{"status":400,"code":"too_many_chunks","when":"More chunks than the tariff `max_chunks_per_task`"},{"status":400,"code":"invalid_split","when":"The split is impossible (a long paragraph in `paragraphs`)"},{"status":400,"code":"voice_not_found","when":"The voice was not found for this engine"},{"status":400,"code":"voice_not_allowed","when":"The ElevenLabs voice is not in the standard list"},{"status":400,"code":"invalid_model","when":"The model is unsupported or retired"},{"status":400,"code":"unsupported_dub_language","when":"The dubbing language is unavailable for the engine or model (`unsupported`, `available`)"},{"status":400,"code":"dub_same_language","when":"The dubbing language equals the text `language`"},{"status":400,"code":"unknown_dub_voice","when":"A `dub_voices` key is not in `dub_languages`"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has ended"},{"status":402,"code":"insufficient_characters","when":"Not enough characters (`required`, `available`)"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":403,"code":"engine_not_allowed","when":"The engine is closed by the tariff"},{"status":429,"code":"too_many_active_tasks","when":"The license `max_parallel_tasks` is reached"},{"status":503,"code":"queue_unavailable","when":"The queue is unavailable, characters refunded"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs is unavailable to check the voice"},{"status":503,"code":"maintenance","when":"Maintenance, new tasks are not accepted"}],"examples":[{"title":"ElevenLabs, minimal request","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 with every setting","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 clone, ZIP per chunk","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 dubbed: English and German with other voices","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":"Active tasks of this key","summary":"Tasks created with this API key that are not finished yet: `pending`, `processing`, `pending_confirmation`. Other keys of the same user are not listed. An empty list if none are active.","auth":"token","params":[],"content_type":null,"response_type":"application/json","response":[{"name":"tasks","type":"array","description":"Active tasks of this key, oldest first. Same fields as [GET /v2/tasks/{task_id}](#tasks-get)"},{"name":"tasks[].task_id","type":"string","description":"Task ID"},{"name":"tasks[].status","type":"string","description":"`pending`, `processing`, `pending_confirmation`, `completed`, `censored`, `failed`, `cancelled`"},{"name":"tasks[].engine","type":"string | null","description":"Task engine"},{"name":"tasks[].progress_percent","type":"number","description":"Readiness 0-100"},{"name":"tasks[].chunks_completed, chunks_total","type":"integer","description":"Synthesized chunks out of the total"},{"name":"tasks[].split_output","type":"boolean","description":"The result will be a ZIP"},{"name":"tasks[].created_at, started_at, completed_at","type":"datetime | null","description":"Stage timestamps"},{"name":"tasks[].error","type":"object | null","description":"`{type, message}`; `type`: `content_blocked`, `failover_confirmation_required`, and others"},{"name":"tasks[].blocked_chunks","type":"array | null","description":"On `censored`: `[{index, text}]` of blocked chunks"},{"name":"tasks[].dubs","type":"array | null","description":"On a dubbing task: `[{language, task_id, status, progress_percent, voice_id}]` of its tracks. The original is synthesized first, then the languages one by one; all files become `completed` together once the track lengths are aligned"},{"name":"tasks[].dub_of, dub_language","type":"string | null","description":"On a dubbing track: the main task and the language"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"}],"examples":[{"title":"Has active tasks","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":"None active","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":"Task status","summary":"Status, progress, and error of your task. For `censored`, `blocked_chunks` holds the fragment texts you need to fix.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"Task ID","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"task_id","type":"string","description":"Task ID"},{"name":"status","type":"string","description":"`pending`, `processing`, `pending_confirmation`, `completed`, `censored`, `failed`, `cancelled`"},{"name":"engine","type":"string | null","description":"Task engine"},{"name":"progress_percent","type":"number","description":"Readiness 0-100"},{"name":"chunks_completed, chunks_total","type":"integer","description":"Synthesized chunks out of the total"},{"name":"split_output","type":"boolean","description":"The result will be a ZIP"},{"name":"created_at, started_at, completed_at","type":"datetime | null","description":"Stage timestamps"},{"name":"error","type":"object | null","description":"`{type, message}`; `type`: `content_blocked`, `failover_confirmation_required`, and others"},{"name":"blocked_chunks","type":"array | null","description":"On `censored`: `[{index, text}]` of blocked chunks"},{"name":"dubs","type":"array | null","description":"On a dubbing task: `[{language, task_id, status, progress_percent, voice_id}]` of its tracks. The original is synthesized first, then the languages one by one; all files become `completed` together once the track lengths are aligned"},{"name":"dub_of, dub_language","type":"string | null","description":"On a dubbing track: the main task and the language"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":404,"code":"task_not_found","when":"The task does not exist or belongs to another token"}],"examples":[{"title":"In progress","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":"Blocked by censorship","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":"Cancel a task","summary":"Cancels a queued task and refunds charged characters. A task that is already synthesizing can be cancelled only on an unlimited subscription (nothing was charged, so there is nothing to refund).","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"Task ID","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"task_id","type":"string","description":"Task ID"},{"name":"status","type":"string","description":"`cancelled`"},{"name":"previous_status","type":"string","description":"Status before cancel"},{"name":"refunded_characters","type":"integer","description":"Characters refunded"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":404,"code":"task_not_found","when":"The task does not exist or belongs to another token"},{"status":409,"code":"already_processing","when":"Already synthesizing, and the subscription is not unlimited"},{"status":409,"code":"already_cancelled","when":"Already cancelled"},{"status":409,"code":"not_cancellable","when":"This status cannot be cancelled (`status`)"},{"status":409,"code":"dub_track_not_cancellable","when":"A dubbing track is cancelled only with its main task (`dub_of`)"}],"examples":[{"title":"Cancel from the queue","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":"Retry after censorship","summary":"Resynthesizes blocked fragments of a `censored` task with corrected text. Other chunks are not synthesized again. The task returns to `pending`.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"Task ID","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"corrected_chunks","where":"body","type":"array","description":"Corrected text for exactly each `index` from `blocked_chunks`, no more and no fewer","required":true,"default":null,"constraints":"at least 1 item","values":[],"fields":[{"name":"index","where":"body","type":"integer","description":"Index from `blocked_chunks`","required":true,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"text","where":"body","type":"string","description":"New fragment text","required":true,"default":null,"constraints":"1-2500 characters, not whitespace only","values":[],"fields":[]}]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"task_id","type":"string","description":"Task ID"},{"name":"status","type":"string","description":"`pending`"},{"name":"retry_chunks_count","type":"integer","description":"How many fragments are resynthesized"},{"name":"charged_characters","type":"integer","description":"Extra charge for characters beyond the original fragments"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":400,"code":"retry_chunks_mismatch","when":"Indexes do not match (`missing`, `unexpected`)"},{"status":400,"code":"duplicate_chunk_index","when":"An index is repeated"},{"status":400,"code":"empty_text","when":"Empty fragment text (`indices`)"},{"status":402,"code":"insufficient_characters","when":"The text is longer and there are no characters for the extra charge"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":404,"code":"task_not_found","when":"The task does not exist or belongs to another token"},{"status":409,"code":"not_censored","when":"The task is not in `censored`"},{"status":409,"code":"retry_unavailable","when":"There is no retry data, create a new task"},{"status":503,"code":"queue_unavailable","when":"The queue is unavailable; the task stayed `censored`"}],"examples":[{"title":"Fix a dialogue part","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":"Fix one fragment","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":"Create a dialogue","summary":"Lines of several voices in one file. Characters are charged immediately for the whole text; the response is `202` with `task_id`. Status, download and cancellation work like tasks: [GET /v2/tasks/{task_id}](#tasks-get), [/download](#tasks-download), [/cancel](#tasks-cancel).","auth":"token","params":[{"name":"text","where":"body","type":"string","description":"The whole dialogue as one text: each line starts on a new row with the voice in square brackets followed by a colon. A line spanning several rows continues without a voice mark. Send either `text` or `inputs`. What such text looks like: [How to write the text](#dialogue-text)","required":false,"default":null,"constraints":"up to 1 000 000 characters","values":[],"fields":[]},{"name":"inputs","where":"body","type":"array","description":"Lines in order, when `text` is not sent","required":false,"default":null,"constraints":"1-2000 lines","values":[],"fields":[{"name":"text","where":"body","type":"string","description":"Line text","required":true,"default":null,"constraints":"1-10 000 characters","values":[],"fields":[]},{"name":"voice_id","where":"body","type":"string","description":"Line voice","required":true,"default":null,"constraints":"1-50 characters","values":[],"fields":[]}]},{"name":"engine","where":"body","type":"string","description":"Engine","required":false,"default":"\"labs\"","constraints":null,"values":[{"value":"labs","description":"ElevenLabs text-to-dialogue: a part of the dialogue is synthesized in one request"},{"value":"cartesia","description":"Each line is a separate Cartesia TTS request, then concatenated"}],"fields":[]},{"name":"model_id","where":"body","type":"string","description":"Model. For `labs`, omitted means `eleven_v4`; `eleven_v4_turbo` and `eleven_v3` are also available. For `cartesia`, the same as Cartesia tasks, default `sonic-3.6`","required":false,"default":null,"constraints":"up to 50 characters","values":[],"fields":[]},{"name":"language_code","where":"body","type":"string","description":"Text language. For `cartesia` it picks the ElevenLabs voice clone in that language and the synthesis language; omitted: detected from the line text. For `labs` it is passed to ElevenLabs as is and may be omitted","required":false,"default":null,"constraints":"2-8 characters, for example `ru`, `en`, `de`","values":[],"fields":[]},{"name":"settings","where":"body","type":"object","description":"ElevenLabs voice settings, `labs` only. Cartesia ignores them","required":false,"default":null,"constraints":null,"values":[],"fields":[{"name":"stability","where":"body","type":"number","description":"Intonation stability","required":false,"default":null,"constraints":"0-1","values":[],"fields":[]}]},{"name":"seed","where":"body","type":"integer","description":"Result repeatability, `labs` only. Cartesia ignores it","required":false,"default":null,"constraints":"0-4 294 967 295","values":[],"fields":[]},{"name":"split_output","where":"body","type":"boolean","description":"`true`: a ZIP of per-part MP3 files instead of one MP3","required":false,"default":"false","constraints":null,"values":[],"fields":[]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"task_id","type":"string","description":"Task ID"},{"name":"status","type":"string","description":"Always `pending`"},{"name":"engine","type":"string","description":"Selected engine"},{"name":"model_id","type":"string","description":"Selected model"},{"name":"voices","type":"array","description":"Voices after validation, in order of appearance (clone IDs for Cartesia)"},{"name":"language_code","type":"string","description":"For `cartesia`, the synthesis language: from the request or detected from the text; for `labs`, the request value, otherwise `null`"},{"name":"lines_count","type":"integer","description":"Number of lines"},{"name":"parts_count","type":"integer","description":"Requests to the provider (task chunks)"},{"name":"characters","type":"integer","description":"Length of all lines"},{"name":"charged_characters","type":"integer","description":"Characters charged; `0` on an unlimited plan"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":400,"code":"empty_text","when":"The lines contain nothing that can be spoken"},{"status":400,"code":"too_many_voices","when":"The dialogue has more than 10 different voices"},{"status":400,"code":"too_many_chunks","when":"More parts than the tariff `max_chunks_per_task`"},{"status":400,"code":"voice_not_found","when":"The voice was not found for this engine"},{"status":400,"code":"invalid_model","when":"The model is not supported"},{"status":402,"code":"subscription_required","when":"No subscription or character package"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has expired"},{"status":402,"code":"insufficient_characters","when":"Not enough characters"},{"status":403,"code":"dialogues_closed","when":"Dialogues are in a closed test and the user is not on the list"},{"status":403,"code":"dialogues_disabled","when":"Dialogues are disabled"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":403,"code":"engine_not_allowed","when":"The engine is closed by the tariff"},{"status":429,"code":"too_many_active_tasks","when":"The license `max_parallel_tasks` is reached"},{"status":503,"code":"queue_unavailable","when":"The queue is unavailable, characters were refunded"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs did not respond, retry later"},{"status":503,"code":"maintenance","when":"Maintenance, new tasks are not accepted"}],"examples":[{"title":"Text with voices inline","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, lines one by one","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: the language is detected from the text","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":"Download the result","summary":"MP3 of a completed task, or a ZIP of per-chunk MP3 files if the task was created with `split_output: true`. The first download of a long task assembles the file from chunks and can take several minutes; later downloads are served immediately.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"Task 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` or `voice_<task_id>_chunks.zip`"},{"name":"Content-Length","type":"header","description":"File size"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":404,"code":"task_not_found","when":"The task does not exist or belongs to another token"},{"status":409,"code":"task_not_completed","when":"The task is not `completed` yet (`status`)"},{"status":409,"code":"task_incomplete","when":"Not all chunks are ready (`ready`, `total`, `missing`)"},{"status":410,"code":"result_expired","when":"The audio has already been deleted after retention"}],"examples":[{"title":"Save the 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":["Inside the ZIP files are named by chunk number with leading zeros: `0000.mp3`, `0001.mp3`, and so on. In ZIP mode an `auto_pause` pause sits at the end of the matching file."],"section":"results","anchor":"#tasks-download"},{"id":"tasks-download-link","method":"POST","path":"/v2/tasks/{task_id}/download-link","title":"Download link without a token","summary":"A short-lived signed URL for the file. You can give it to a browser, a player, or a user: the token never appears in the URL.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"Task ID","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"ttl_seconds","where":"query","type":"integer","description":"Link lifetime in seconds. Default 3600","required":false,"default":null,"constraints":"60-86400","values":[],"fields":[]}],"content_type":null,"response_type":"application/json","response":[{"name":"url","type":"string","description":"Ready URL for /v2/tasks/{task_id}/file"},{"name":"expires_at","type":"datetime","description":"When the link stops working"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":404,"code":"task_not_found","when":"The task does not exist or belongs to another token"},{"status":409,"code":"task_not_completed","when":"The task is not `completed` yet (`status`)"},{"status":409,"code":"task_incomplete","when":"Not all chunks are ready (`ready`, `total`, `missing`)"},{"status":503,"code":"download_signing_disabled","when":"Signed links are not configured on the server"}],"examples":[{"title":"Link for 10 minutes","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":"Download via a signed link","summary":"Same as /download, but instead of a token it uses the signature from [/download-link](#tasks-download-link). You usually do not build the URL by hand: take it whole from `url`.","auth":"signed","params":[{"name":"task_id","where":"path","type":"string","description":"Task ID","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"exp","where":"query","type":"integer","description":"Unix time when the link ends","required":true,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"sig","where":"query","type":"string","description":"HMAC signature","required":true,"default":null,"constraints":"64 hexadecimal characters","values":[],"fields":[]}],"content_type":null,"response_type":"audio/mpeg | application/zip","response":[],"errors":[{"status":401,"code":"invalid_download_link","when":"The signature is invalid or has expired"},{"status":409,"code":"task_not_completed","when":"The task is not `completed` yet (`status`)"},{"status":409,"code":"task_incomplete","when":"Not all chunks are ready (`ready`, `total`, `missing`)"},{"status":410,"code":"result_expired","when":"The audio has already been deleted after retention"}],"examples":[{"title":"Download","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":"Captions from ElevenLabs timestamps","summary":"Instant captions from the timestamps ElevenLabs returns with the audio. Works for `engine=original` tasks in `completed` or `censored`. `auto_pause` pauses are included.","auth":"token","params":[{"name":"task_id","where":"path","type":"string","description":"Task ID","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"format","where":"query","type":"string","description":"File format","required":false,"default":"\"srt\"","constraints":null,"values":[{"value":"srt","description":"SubRip, `application/x-subrip`"},{"value":"vtt","description":"WebVTT, `text/vtt`"},{"value":"json","description":"Per-character marks: `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":"Missing Authorization header or the token is invalid"},{"status":404,"code":"task_not_found","when":"The task does not exist or belongs to another token"},{"status":409,"code":"task_not_ready","when":"Synthesis is not finished yet"},{"status":409,"code":"no_timestamps","when":"The task has no timestamps (usually 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":["With `split_output: true` you get a ZIP `<task_id>_subtitles.zip` with one file per chunk; timestamps in each file start at zero.","Timestamps are kept for an hour after the task finishes, then you get `409 no_timestamps`. Request captions right after `completed`.","For [dubbing](#dubbing), request captions by the `task_id` of each track in `dubs`: timestamps match the track's aligned audio."],"section":"subtitles","anchor":"#tasks-subtitles"},{"id":"captions-create","method":"POST","path":"/v2/captions","title":"Captions via speech recognition","summary":"Captions for finished audio via speech recognition. Works for any engine, including Cartesia. Characters are not charged. The request is synchronous and takes from seconds to a couple of minutes.","auth":"token","params":[{"name":"task_id","where":"body","type":"string","description":"Your task ID","required":true,"default":null,"constraints":"1-36","values":[],"fields":[]},{"name":"format","where":"body","type":"string","description":"File format","required":false,"default":"\"srt\"","constraints":null,"values":[{"value":"srt","description":"SubRip"},{"value":"vtt","description":"WebVTT"}],"fields":[]},{"name":"language","where":"body","type":"string","description":"Spoken language: ISO 639-1 (`ru`, `en`, `uk`, `de`...) or `auto`. Empty or `auto`: detect from audio among ru, en, uk","required":false,"default":null,"constraints":"up to 16 characters","values":[],"fields":[]}],"content_type":"application/json","response_type":"application/x-subrip | text/vtt | application/zip","response":[],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":404,"code":"task_not_found","when":"The task does not exist or belongs to another token"},{"status":409,"code":"task_not_ready","when":"Synthesis is not finished yet"},{"status":422,"code":"invalid_language","when":"The language code is not recognized"},{"status":502,"code":"transcription_failed","when":"Speech could not be recognized"},{"status":503,"code":"transcription_timeout","when":"Recognition took too long"},{"status":503,"code":"no_account_available","when":"Recognition is temporarily unavailable"}],"examples":[{"title":"SRT in Russian","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":["For a task with `split_output: true` you get a ZIP with `0000.srt`, `0001.srt` per chunk. For a task with `auto_pause` each chunk is recognized separately and shifted by the duration of the previous ones, so timestamps match the pauses in the MP3."],"section":"subtitles","anchor":"#captions-create"},{"id":"captions-upload","method":"POST","path":"/v2/captions/upload","title":"Captions for your own audio","summary":"Captions for any audio file without a TTS task. The result name is taken from the file name.","auth":"token","params":[{"name":"file","where":"form","type":"file","description":"Audio file","required":true,"default":null,"constraints":null,"values":[],"fields":[]},{"name":"format","where":"form","type":"string","description":"File format","required":false,"default":"\"srt\"","constraints":null,"values":[{"value":"srt","description":"SubRip"},{"value":"vtt","description":"WebVTT"}],"fields":[]},{"name":"language","where":"form","type":"string","description":"Spoken language: ISO 639-1 or `auto`; empty: detect from audio","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":"Missing Authorization header or the token is invalid"},{"status":400,"code":"empty_audio","when":"Empty file"},{"status":422,"code":"invalid_language","when":"The language code is not recognized"},{"status":502,"code":"transcription_failed","when":"Speech could not be recognized"},{"status":503,"code":"transcription_timeout","when":"Recognition took too long"},{"status":503,"code":"no_account_available","when":"Recognition is temporarily unavailable"}],"examples":[{"title":"VTT for a podcast","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":"Create music","summary":"A track from a text prompt. The call is synchronous and does not charge characters. An active subscription is required: unlimited still in term, or a character pack with a balance. `download_url` lasts about a day.","auth":"token","params":[{"name":"prompt","where":"body","type":"string","description":"Track description: genre, mood, era","required":true,"default":null,"constraints":"1-2000 characters","values":[],"fields":[]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"id","type":"string","description":"Provider track ID"},{"name":"status","type":"string","description":"Status, for example `generating_music`"},{"name":"progress","type":"number","description":"Progress from 0 to 1, when the provider sends it"},{"name":"prompt","type":"string","description":"Prompt that was sent"},{"name":"title","type":"string","description":"Track title"},{"name":"description","type":"string","description":"Short description"},{"name":"genres","type":"string[]","description":"Genres"},{"name":"bpm","type":"integer","description":"Tempo"},{"name":"duration_ms","type":"integer","description":"Length in milliseconds"},{"name":"download_url","type":"string","description":"File URL, usually MP4"},{"name":"failure_reason","type":"string","description":"Failure reason, when present"},{"name":"waveform","type":"integer[]","description":"Amplitudes for a waveform"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":402,"code":"subscription_required","when":"No active subscription"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has ended"},{"status":429,"code":"too_many_generations","when":"The tariff thread limit on this key is reached"},{"status":503,"code":"no_proxy","when":"Generation is temporarily unavailable"},{"status":502,"code":"generation_failed","when":"The request was rejected or the response could not be parsed"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs did not respond, retry later"}],"examples":[{"title":"Dubstep","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":["Until `status` is final, the file at `download_url` may still be written. Download it again after a few seconds."],"section":"studio","anchor":"#studio-music"},{"id":"studio-sound","method":"POST","path":"/v2/sound-effects","title":"Create a sound effect","summary":"Several takes of an effect from text. The call is synchronous and does not charge characters. An active subscription is required. `audio_base64` is the audio itself (Opus), not a waveform picture.","auth":"token","params":[{"name":"text","where":"body","type":"string","description":"What should be heard","required":true,"default":null,"constraints":"1-500 characters","values":[],"fields":[]},{"name":"loop","where":"body","type":"boolean","description":"Loop the clip","required":false,"default":"false","constraints":null,"values":[],"fields":[]},{"name":"output_format","where":"body","type":"string","description":"Provider audio format","required":false,"default":"\"opus_48000_128\"","constraints":"1-64 characters","values":[],"fields":[]}],"content_type":"application/json","response_type":"application/json","response":[{"name":"items","type":"object[]","description":"Effect takes"},{"name":"items[].id","type":"string","description":"Take ID"},{"name":"items[].text","type":"string","description":"Request text"},{"name":"items[].content_type","type":"string","description":"MIME, usually `audio/opus`"},{"name":"items[].duration_seconds","type":"number","description":"Length in seconds"},{"name":"items[].audio_base64","type":"string","description":"Audio as base64"},{"name":"items[].subgroup_id","type":"string","description":"Shared group of takes from one request"},{"name":"items[].subgroup_position","type":"integer","description":"Take number in the group"}],"errors":[{"status":401,"code":null,"when":"Missing Authorization header or the token is invalid"},{"status":403,"code":"user_blocked","when":"The user is blocked"},{"status":402,"code":"subscription_required","when":"No active subscription"},{"status":402,"code":"subscription_expired","when":"The unlimited subscription has ended"},{"status":429,"code":"too_many_generations","when":"The tariff thread limit on this key is reached"},{"status":503,"code":"no_proxy","when":"Generation is temporarily unavailable"},{"status":502,"code":"generation_failed","when":"The request was rejected or the response could not be parsed"},{"status":503,"code":"elevenlabs_unavailable","when":"ElevenLabs did not respond, retry later"}],"examples":[{"title":"Engine sound","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":"A dialogue retry changes the text and keeps the voices","text":"In a dialogue `blocked_chunks`, `text` is the whole part with all its lines. Send it to [/retry](#tasks-retry) as the same text with voices inline as on creation: the same `voice_id` values in the same order, only the line text changes. A different set of voices or text without marks yields `409 retry_unavailable`.","sections":["dialogues"]},{"id":"labs-clone-slots","title":"Clones from ElevenLabs voices do not use slots","text":"A clone created with `elevenlabs_voice_id` goes into the shared catalog and does not spend `max_cartesia_clones`. Only a clone from your own audio uses a slot. If a clone of that voice in that language already exists, /clone returns it with `reused: true` and creates nothing.","sections":["cloning","cartesia"]},{"id":"clone-slots-count","title":"Only deletion frees a slot","text":"`clones_used` counts your clones in any status. To free a slot, delete the clone with DELETE /v2/voices/cartesia/{voice_id}. Shared-catalog clones cannot be deleted and do not use slots.","sections":["cloning"]},{"id":"labs-id-in-task","title":"An ElevenLabs voice ID works in a Cartesia task","text":"In a task with `engine=cartesia` you can pass an ElevenLabs voice ID that has a clone: the service takes yours first, then one from the shared catalog. If there is no clone, you get `400 voice_not_found`: call /clone with `elevenlabs_voice_id` first.","sections":["tasks","cartesia"]},{"id":"clone-languages","title":"A clone is created in the Cartesia language you set","text":"A Sonic language code (`ru`, `en`, `de`, `uk`, `ja`, and the rest) is stored as the clone language. An empty code means ru. If Cartesia has no such code, an unsupported Slavic code (`be`, `sr`, `bs`, `sl`, `mk`, `cnr`) produces a ru clone and anything else an en clone. A task `language` selects the clone of the same ElevenLabs voice in that language when one exists, and is sent to synthesis.","sections":["cloning","tasks"]},{"id":"library-voices-original","title":"ElevenLabs library voices are not for engine=original","text":"A task with `engine=original` accepts only the standard ElevenLabs voices from the table. A voice from search or featured yields `400 voice_not_allowed`. You can speak with it through a Cartesia clone.","sections":["voices","tasks"]},{"id":"charge-on-create","title":"Characters are charged on create","text":"The cost is `len(text)`, multiplied by (1 + 1.5 × number of languages) with `dub_languages`, and is charged immediately. Characters are refunded when you cancel a `pending` task, on `503 queue_unavailable`, and when synthesis ends as `failed`. On `censored` they are not refunded: the spoken part is kept, and blocked fragments are resynthesized via /retry.","sections":["tasks"]},{"id":"cancel-processing","title":"Only unlimited can cancel a started task","text":"A task in `processing` can be cancelled only on an unlimited subscription, where nothing was charged for it. On a character package you get `409 already_processing`.","sections":["tasks"]},{"id":"parallel-limit","title":"Parallel task limit per license","text":"A slot is taken by tasks in `pending`, `processing`, and `pending_confirmation`. Beyond the tariff `max_parallel_tasks` you get `429 too_many_active_tasks`: wait for one task to finish. How fast a task itself runs is `threads_per_task`, how many chunks are synthesized in parallel.","sections":["tasks","account"]},{"id":"cartesia-chunk","title":"Cartesia splits text at 500 characters","text":"For `engine=cartesia`, `max_chunk_length` is capped at 500 in `smart` and `max_length`. In `paragraphs` the line is sent whole, up to 2500 characters.","sections":["tasks"]},{"id":"cjk-chunk","title":"Chinese, Japanese, and Korean: up to 500 characters","text":"If more than 20% of the text is CJK characters or Hangul, chunk length is capped at 500 for any engine.","sections":["tasks"]},{"id":"quotes","title":"Quotes are normalized","text":"Every kind of quote («», „“, “”, 「」) in chunks is replaced with `\"`, and an unpaired quote at a chunk edge is removed so the model does not speak it. `smart` does not split text inside quotes.","sections":["tasks"]},{"id":"voice-settings-cartesia","title":"voice_settings is ElevenLabs only","text":"Cartesia ignores `voice_settings`. An ElevenLabs model (`eleven_*`) in a Cartesia task is not an error: it is replaced with `sonic-3.6`.","sections":["tasks"]},{"id":"auto-pause","title":"Pauses between chunks","text":"`auto_pause` adds `duration` seconds of silence at the end of every `frequency`-th chunk; there is no pause after the last chunk. Pauses are included in captions from both methods. To place pauses between paragraphs, use `split_type: paragraphs`.","sections":["tasks","subtitles"]},{"id":"split-output","title":"split_output: ZIP per chunk","text":"With `split_output: true`, /download returns a ZIP `0000.mp3`, `0001.mp3`, ... without concatenation, and captions come as a ZIP with one file per chunk and local timestamps. The mode is set when the task is created and cannot be changed later.","sections":["results","subtitles"]},{"id":"download-first","title":"The first download is slower","text":"A single MP3 is assembled from chunks on the first /download and then cached. For long texts set a read timeout of at least 10 minutes. Audio is kept for a limited time, after which you get `410 result_expired`.","sections":["results"]},{"id":"result-retention","title":"Audio and timestamps are kept for an hour","text":"An hour after a task finishes, the service deletes its audio and ElevenLabs timestamps: /download responds `410 result_expired`, /subtitles `409 no_timestamps`, and /v2/captions has nothing left to recognize. Fetch files and captions right after `completed`. For [dubbing](#dubbing), the original and every track are kept until the last language is ready and for an hour after it. A `censored` task keeps the spoken part while it waits for /retry; the task record itself is kept for 30 days.","sections":["results","subtitles"]},{"id":"censored-retry","title":"Retry after censorship","text":"Only `blocked_chunks` are resynthesized. Indexes in `corrected_chunks` must match them exactly. If the new text is not longer, the retry is free and works even after the subscription ends. While the task is `censored`, captions via /subtitles are already available for the spoken part.","sections":["tasks"]},{"id":"pending-confirmation","title":"pending_confirmation needs no action","text":"The status appears when primary ElevenLabs synthesis has temporarily degraded. The task waits for an operator; you cannot cancel it from the API. Keep polling the status.","sections":["tasks"]},{"id":"cartesia-subtitles","title":"Cartesia captions only via /v2/captions","text":"Cartesia does not return timestamps, so /v2/tasks/{task_id}/subtitles yields `409 no_timestamps`. Use POST /v2/captions with the same `task_id`. Recognition does not spend characters.","sections":["subtitles"]},{"id":"maintenance","title":"Maintenance","text":"During maintenance POST /v2/tasks responds `503 maintenance`. Other requests, including status and download, keep working.","sections":["tasks"]},{"id":"studio-subscription","title":"Music and effects need an active subscription","text":"POST /v2/music and POST /v2/sound-effects do not charge characters and do not take a `max_parallel_tasks` slot. One API key runs at most `threads_per_task` generations at once; music and effects share that limit. An active subscription is required: unlimited still in term, or a character pack with a remaining balance.","sections":["studio"]},{"id":"strict-body","title":"Extra body fields are forbidden","text":"Bodies of POST /v2/tasks and /retry are strict: an unknown field, a typo in a name, or a value out of range yields `422` with a list of errors in `detail`.","sections":["tasks"]}],"error_codes":[{"code":"empty_text","statuses":[400],"meaning":"The text has no letters or digits","action":"Check the text"},{"code":"text_too_long","statuses":[400],"meaning":"The text is longer than `max_chars_per_task`","action":"Split into several tasks"},{"code":"too_many_chunks","statuses":[400],"meaning":"More chunks than `max_chunks_per_task`","action":"Increase `max_chunk_length` or split the text"},{"code":"invalid_split","statuses":[400],"meaning":"A paragraph is longer than 2500 characters in `paragraphs`","action":"Split the paragraph or use `smart`"},{"code":"voice_not_found","statuses":[400,404],"meaning":"The voice was not found for the engine","action":"Take an ID from the voice lists"},{"code":"voice_not_allowed","statuses":[400],"meaning":"The ElevenLabs voice is not in the standard list","action":"Use a standard voice or a Cartesia clone"},{"code":"invalid_model","statuses":[400],"meaning":"The model is unsupported or retired","action":"Take a model from /v2/voices/models"},{"code":"unsupported_dub_language","statuses":[400],"meaning":"The dubbing language is unavailable for the engine or model","action":"Take a language from `available`"},{"code":"dub_same_language","statuses":[400],"meaning":"The dubbing language equals the text language","action":"Remove that language"},{"code":"unknown_dub_voice","statuses":[400],"meaning":"A `dub_voices` key is not in `dub_languages`","action":"Keep only languages from `dub_languages`"},{"code":"subscription_required","statuses":[402],"meaning":"No subscription or character package","action":"Buy a package in the bot"},{"code":"subscription_expired","statuses":[402],"meaning":"Unlimited has ended","action":"Renew the subscription in the bot"},{"code":"insufficient_characters","statuses":[402],"meaning":"Not enough characters (`required`, `available`)","action":"Top up the balance or shorten the text"},{"code":"user_blocked","statuses":[403],"meaning":"The user is blocked","action":"Contact support"},{"code":"engine_not_allowed","statuses":[403],"meaning":"The engine is closed by the tariff","action":"Change `engine` or the tariff"},{"code":"clone_limit_reached","statuses":[403],"meaning":"All of your clone slots are used","action":"Delete your clone or clone with `elevenlabs_voice_id`"},{"code":"shared_clone","statuses":[403],"meaning":"A shared-catalog clone","action":"Nothing to delete, it does not use a slot"},{"code":"task_not_found","statuses":[404],"meaning":"The task is missing or belongs to another token","action":"Check `task_id` and the token"},{"code":"elevenlabs_voice_not_found","statuses":[404,422],"meaning":"The voice is not in ElevenLabs","action":"Check the ID via search"},{"code":"preview_not_found","statuses":[404],"meaning":"The voice has no sample","action":"Do not show a player"},{"code":"task_not_completed","statuses":[409],"meaning":"The task is not `completed` yet","action":"Wait for the status"},{"code":"task_incomplete","statuses":[409],"meaning":"Not all chunks are ready (`missing`)","action":"Retry in 10-60 seconds"},{"code":"task_not_ready","statuses":[409],"meaning":"Synthesis is not finished","action":"Wait for the status"},{"code":"no_timestamps","statuses":[409],"meaning":"The task has no ElevenLabs timestamps","action":"Use POST /v2/captions"},{"code":"already_processing","statuses":[409],"meaning":"The task is already synthesizing","action":"Wait for the result"},{"code":"already_cancelled","statuses":[409],"meaning":"The task is already cancelled","action":"Nothing"},{"code":"not_cancellable","statuses":[409],"meaning":"The status does not allow cancel","action":"Nothing"},{"code":"dub_track_not_cancellable","statuses":[409],"meaning":"A dubbing track is cancelled with its main task","action":"Cancel the task from `dub_of`"},{"code":"not_censored","statuses":[409],"meaning":"Retry is only for `censored`","action":"Check the status"},{"code":"retry_unavailable","statuses":[409],"meaning":"There is no retry data","action":"Create a new task"},{"code":"too_many_voices","statuses":[400],"meaning":"The dialogue has more than 10 different voices","action":"Reduce the number of voices"},{"code":"dialogues_closed","statuses":[403],"meaning":"Dialogues are in a closed test","action":"Wait for the public launch"},{"code":"dialogues_disabled","statuses":[403],"meaning":"Dialogues are disabled","action":"Retry later"},{"code":"retry_chunks_mismatch","statuses":[400],"meaning":"Indexes did not match `blocked_chunks`","action":"Send exactly `missing` with no `unexpected`"},{"code":"duplicate_chunk_index","statuses":[400],"meaning":"An index is repeated","action":"Remove duplicates"},{"code":"result_expired","statuses":[410],"meaning":"Audio was deleted after retention","action":"Synthesize again"},{"code":"invalid_download_link","statuses":[401],"meaning":"The signature is invalid or expired","action":"Get a new link"},{"code":"clip_too_large","statuses":[413],"meaning":"The clip is larger than 16 MB","action":"Compress or trim"},{"code":"unsupported_format","statuses":[415],"meaning":"The clip format is not supported","action":"Convert to mp3 or wav"},{"code":"clip_required","statuses":[422],"meaning":"No clip and no `elevenlabs_voice_id`","action":"Send one of the two"},{"code":"invalid_duration","statuses":[422],"meaning":"The clip is not 10-60 seconds","action":"Trim or lengthen"},{"code":"invalid_audio","statuses":[422],"meaning":"The file cannot be read as audio","action":"Check the file"},{"code":"empty_clip","statuses":[422],"meaning":"Empty clip","action":"Check the file"},{"code":"cartesia_rejected","statuses":[422],"meaning":"Cartesia did not accept the clip","action":"Use a cleaner clip, no music"},{"code":"invalid_language","statuses":[422],"meaning":"The language code is not recognized","action":"Send ISO 639-1 or `auto`"},{"code":"empty_audio","statuses":[400],"meaning":"Empty file","action":"Check the file"},{"code":"too_many_active_tasks","statuses":[429],"meaning":"`max_parallel_tasks` is reached","action":"Wait for a task to finish"},{"code":"too_many_generations","statuses":[429],"meaning":"The tariff thread limit on this API key is reached","action":"Wait for a generation to finish"},{"code":"transcription_failed","statuses":[502],"meaning":"Speech was not recognized","action":"Check the audio, set `language`"},{"code":"cartesia_unavailable","statuses":[502],"meaning":"Cartesia did not respond","action":"Retry in 10-60 seconds"},{"code":"transcription_timeout","statuses":[503],"meaning":"Recognition did not finish in time","action":"Retry in 10-60 seconds"},{"code":"queue_unavailable","statuses":[503],"meaning":"The queue is unavailable, characters refunded","action":"Retry in 10-60 seconds"},{"code":"generation_failed","statuses":[502],"meaning":"Generation was rejected or the response was invalid","action":"Change the request"},{"code":"no_proxy","statuses":[503],"meaning":"No channel to generation","action":"Retry in 10-60 seconds"},{"code":"elevenlabs_unavailable","statuses":[503],"meaning":"ElevenLabs did not respond","action":"Retry in 10-60 seconds"},{"code":"no_account_available","statuses":[503],"meaning":"No free provider account","action":"Retry in 10-60 seconds"},{"code":"download_signing_disabled","statuses":[503],"meaning":"Signed links are disabled","action":"Download via /download"},{"code":"maintenance","statuses":[503],"meaning":"Maintenance","action":"Retry later, the text is in `message`"}]}