---
title: "POST /orders/{order}/dub — Дубляж заказа"
url: https://lumean.app/developers/docs/api/post-orders-order-dub
locale: ru
description: "Дубляж заказа"
generated: 2026-11-08
operationId: dubbing.store
method: POST
path: "/orders/{order}/dub"
scopes: [orders.write]
spec_version: 1.0.0
---

# POST /orders/{order}/dub

**Дубляж заказа**

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

Создаёт НОВЫЙ заказ (один фрагмент) сервиса дубля: исходник `cartesia` → `cartesia_dub`,
исходник `elevenlabs` → `elevenlabs_dub` (`task_type` нового заказа = код сервиса дубля).
Готовность — как у любого заказа: WS-канал `private-order.task.{orderId}` или опрос
`GET /orders/{order}`. Дорожка `output/chunks/0/result.mp3` — в `result.files[]`, субтитры
`subtitles.srt` — в `result.service_files[]`; ссылку на скачивание даёт `POST /storage/url`.

**Тело:**

- `target_language` (обязателен) — язык дубля из `languages` справочника;
- `voice_id` — голос дубля; не передан — голос шаблона (снимок исходного заказа или
  `template_id`). Формат — как в шаблоне сервиса: Cartesia — id голоса каталога или
  своего клона, ElevenLabs — 20-символьный id голоса;
- `model_id` — модель из `models` справочника; не передана — модель шаблона;
- `template_id` — ваш шаблон того же сервиса, что исходник: голос и модель берутся
  из него. Чужой шаблон или шаблон другого сервиса — `422`, без списания;
- `name` — название нового заказа (по умолчанию «<имя исходника> → EN»).

**Исходник:** только свой завершённый заказ с сохранёнными файлами, одна дорожка
(не абзацный режим), не длиннее `max_source_chars`. Язык дубля не равен языку исходника:
у исходника Cartesia совпадение отбивается сразу (`422`), у ElevenLabs язык исходника не
известен (`auto`) — такой дубль упадёт у исполнителя и вернёт деньги целиком.

**Оплата:** за символ исходника, перевод входит в цену — Cartesia 1,35 символа Cartesia,
ElevenLabs 1,5 символа ElevenLabs (и минимум сервиса). Сначала квота подписки
(по праву исходного сервиса), остаток — PAYG с баланса. Упавший дубль возвращает деньги
целиком. Узнать цену заранее — `GET /orders/{order}/dub/quote`.

Стоимость дубля списывается с токен-квоты вашего ключа. Проверка идёт **до** создания
заказа: при превышении вернётся `429`, заказ не создастся. Тот же запрос (тот же исходник
и те же поля) в течение минуты после первого получит `409` `duplicate_order` — защита
от двойной отправки.

**Требуемое право ключа:** `orders.write`.

- Право ключа: `orders.write`

## Запрос

```bash
curl -X POST 'https://api.lumean.app/api/public/orders/{order}/dub' \
  -H 'Accept: application/json' \
  -H 'X-API-KEY: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "target_language": "en"
}'
```

## Параметры

| Поле | Где | Тип | Обяз. | Описание |
| --- | --- | --- | --- | --- |
| `order` | path | `string` | обяз. | UUID заказа — 36 символов вида `9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c`, не число. Берётся из поля `id`: его возвращает `POST /orders` при создании и `GET /orders` в списке. Чужой заказ по вашему ключу не откроется — придёт `404`. |
| `X-Locale` | header | `string` | — | Язык локализованных текстов ответа (`message`, подписи, причины ошибок), код ISO-639-1. Необязателен; без него — язык аккаунта владельца ключа, затем `Accept-Language`, затем язык по умолчанию. Неизвестный или неподдерживаемый код пропускается так же, как отсутствующий. |
| `X-Timezone` | header | `string` | — | IANA-зона (`Europe/Moscow`), в которой ответ показывает моменты времени — ISO-8601 со смещением. Необязателен; без него даты приходят в UTC. Невалидная зона игнорируется. Применённую зону сервер возвращает в одноимённом заголовке ответа. |

## Тело запроса

Дубляж готового заказа озвучки: язык дубля и, по желанию, голос, модель, шаблон и
название. Оплачиваемую длину и файлы исходника сервер берёт из исходного заказа сам.

Content-Type: `application/json`

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `target_language` | `string` — ≤ 16 симв. | обяз. | Язык дубля — значение из `languages` справочника `GET /orders/dubbing/options` для вида исходника. Не равен языку исходника (`422` `dub_same_language`). Для создания обязателен, для котировки — нет. |
| `voice_id` | `string` — ≤ 64 симв. — nullable | — | Голос дубля. Не передан — голос шаблона: снимок шаблона исходного заказа или `template_id`. Формат как в шаблоне сервиса: Cartesia — id голоса каталога или своего клона (UUID), ElevenLabs — 20-символьный id голоса. |
| `model_id` | `string` — ≤ 64 симв. — nullable | — | Модель дубля из `models` справочника. Не передана — модель шаблона, а без неё `default_model`. |
| `template_id` | `string` — ≤ 64 симв. — nullable | — | Ваш шаблон того же сервиса, что исходник (`cartesia` или `elevenlabs`): голос, модель и настройки голоса берутся из него вместо снимка исходного заказа. Явные `voice_id` и `model_id` его перекрывают. Чужой, удалённый шаблон или шаблон другого сервиса — `422` по полю `template_id`, без списания. |
| `name` | `string` — ≤ 120 симв. — nullable | — | Название нового заказа, до 120 символов. Не передано — «<название исходника> → <ЯЗЫК>». |

**Пример**

```json
{
  "target_language": "en"
}
```

## Сценарии тела

### Только язык

Голос и модель — из снимка шаблона исходного заказа.

```json
{
  "target_language": "en"
}
```

### Свой голос и модель

Голос дубля из каталога сервиса и модель из справочника.

```json
{
  "target_language": "en",
  "voice_id": "5d2f0a1c-8b3e-4f5a-9c6d-7e8f9a0b1c2d",
  "model_id": "sonic-3",
  "name": "Chapter 1 (EN)"
}
```

### Голос из другого шаблона

Голос и модель — из вашего шаблона того же сервиса.

```json
{
  "target_language": "de",
  "template_id": "01a1701b-c1eb-7000-8000-000000000000"
}
```

## Ответы

### 201 — Заказ дубля создан

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Признак успеха. Решение принимайте по HTTP-коду: у любого ответа 2xx здесь `true`, а ошибка приходит телом другой формы, где этого поля может не быть вовсе. |
| `message` | `string` | обяз. | Пояснение для человека, на языке аккаунта. Показать пользователю можно; разбирать программно — нет: формулировки меняются без предупреждения и кодом ошибки не являются. |
| `data` | `Order` | обяз. | **Новый** заказ дубля (`task_type` — `cartesia_dub` или `elevenlabs_dub`). Исходный заказ не меняется. |
| `data.id` | `string` | обяз. | UUID заказа. Его подставляют в пути `/orders/{order}/…` и передают в `POST /orders/{order}/retry`. |
| `data.user_id` | `integer` | обяз. | ID владельца заказа. У заказов, созданных по API-ключу, это всегда владелец ключа — чужой заказ по ключу не увидеть. |
| `data.name` | `string` | обяз. | Название заказа: из него берутся имя скачиваемого файла и имя ZIP-архива. |
| `data.template` | `Template` | — | Шаблон, по которому создан заказ. Приходит только у заказов с `template_id`; у заказа без шаблона (`sfx`/`music` по `task_type`) поля нет. `config` внутри — настройки, с которыми выполняется ИМЕННО этот заказ: конфиг шаблона на момент создания заказа с наложенным `config_override`; правка шаблона после создания его не меняет. В списке `GET /orders` `config` приходит `null` — полный конфиг отдаёт `GET /orders/{order}`. Шаблон могли удалить после создания заказа: здесь он виден по-прежнему, но `GET /templates/{template}` ответит `404`, а новый заказ с этим `template_id` — `422`. У заказов, созданных до выхода этой версии API (конец сентября 2026 года), снимка нет: там `config` — текущий конфиг шаблона с наложенным `config_override`, и правка шаблона его меняет. |
| `data.template.id` | `string` | обяз. | UUID шаблона. Его кладут в `template_id` при создании заказа. |
| `data.template.user_id` | `integer` | обяз. | ID владельца шаблона. |
| `data.template.slug` | `string` | обяз. | Короткий публичный идентификатор для расшаривания. `null` у шаблона, которым не делились. |
| `data.template.name` | `string` | обяз. | Название шаблона — только для человека, на поведение генерации не влияет. |
| `data.template.service_key` | `string` | обяз. | Код сервиса, по схеме которого валидируется `config`: `elevenlabs`, `lumimg` и т. д. |
| `data.template.service` | `Service \| null` — nullable | обяз. | Сервис шаблона справочно: название и тарификация, без схем конфигурации. `null` означает, что сервиса с таким кодом больше нет. |
| `data.template.config` | `object` | обяз. | Настройки генерации: голос, модель, скорость и прочее — набор ключей задаёт сервис. Допустимые значения смотрите в `GET /templates/config-options?service=<код>`, значение вне схемы отклоняется с `422`. В заказе (`template` в `GET /orders/{order}`) это настройки самого заказа — снимок на момент его создания с `config_override`, а не текущий конфиг шаблона (у заказов, созданных до конца сентября 2026 года, — текущий конфиг шаблона с `config_override`). |
| `data.template.is_public` | `boolean` | обяз. | Опубликован ли шаблон в общем каталоге. |
| `data.template.folder_id` | `string` | обяз. | UUID папки, в которой лежит шаблон, либо `null` для корня. Структура папок видна в `GET /templates/browse`. |
| `data.template.created_at` | `string` — date-time — nullable | обяз. | Когда шаблон создан, ISO 8601. |
| `data.template.updated_at` | `string` — date-time — nullable | обяз. | Когда шаблон последний раз менялся, ISO 8601. |
| `data.template_id` | `string` | обяз. | UUID использованного шаблона либо `null`, если заказ создан без шаблона. |
| `data.task_type` | `TaskType` — `tts` · `image` · `txt2img` · `remix` · `image_edit` · `voice_clone` · `sfx` · `music` · `voice_search` · `cartesia_dub` · `elevenlabs_dub` | обяз. | Тип задачи — он определяет, что лежит в `task_data` и что придёт в `result`. |
| `data.status` | `OrderStatus` — `created` · `pending` · `in_progress` · `completed` · `result_delivered` · `failed` · `compensated` · `cancelled` · `partially_completed` | обяз. | Текущее состояние заказа. Терминальных пять — `completed`, `result_delivered`, `failed`, `compensated`, `cancelled`; после них опрашивать заказ смысла нет. `partially_completed` — НЕ терминальный: часть чанков готова, часть упала. Файлы уже можно забирать, а сбойные фрагменты перезапускать через `POST /orders/{order}/items/retry-failed` — после повтора заказ может перейти в `completed`. `compensated` и `failed` — заказ закрыт без результата. `compensated` — штатный исход: ни один фрагмент не получился (сбой генерации или все фрагменты отклонены контентной политикой), блокировка по заказу снята, квота возвращена; удерживается только плата за попытки `policy_flagged` (см. `items[].status`). `failed` — редкий: заказ упал на подготовке входных файлов (возврат при этом сделан сразу) либо автоматический возврат не прошёл — такой заказ доводит поддержка. Если хоть один фрагмент готов, сбой даёт не их, а `partially_completed`: готовое оплачивается, упавшее можно повторить. |
| `data.price_units` | `integer` | обяз. | Заблокированная под заказ сумма в минимальных единицах LMC. Показывать это число как есть нельзя: реальное значение — `price_units / 10^precision`, где `precision` берётся из актива рядом. Готовое к показу значение лежит в соседнем decimal-поле. |
| `data.price_formatted` | `number` — nullable | обяз. | Та же сумма, что и `price_units`, но в целых LMC — готова к показу. `null`, пока стоимость не зафиксирована. |
| `data.currency_asset` | `Asset` | обяз. | Актив суммы — всегда LMC. Его `precision` нужен, чтобы перевести минимальные единицы в реальное значение. |
| `data.currency_asset.id` | `integer` | обяз. | Внутренний идентификатор актива. |
| `data.currency_asset.code` | `string` | обяз. | Код актива: `LUMC` — внутренняя валюта, `TOKEN` — токены генерации. |
| `data.currency_asset.kind` | `AssetKind` — `money` · `unit` | обяз. | Вид актива: деньги или расходуемые единицы. От него зависит, где сумма считается платежом, а где — расходом квоты. |
| `data.currency_asset.precision` | `integer` | обяз. | Число десятичных знаков. **Ключевое поле:** любая целая сумма этого актива делится на `10^precision`, чтобы получить реальное значение. Не считайте, что делитель равен 100. |
| `data.currency_asset.name` | `string` | обяз. | Название актива для показа, на языке аккаунта. |
| `data.currency_asset.deleted_at` | `string` — date-time — nullable | обяз. | Когда актив выведен из обращения, ISO 8601. `null` у действующего. |
| `data.currency_asset.created_at` | `string` — date-time — nullable | обяз. | Когда актив заведён, ISO 8601. |
| `data.currency_asset.updated_at` | `string` — date-time — nullable | обяз. | Когда актив последний раз менялся, ISO 8601. |
| `data.total_tokens` | `integer` — nullable | обяз. | Полная стоимость заказа в токенах: исходные чанки плюс все повторы и перегенерации. Это единица квоты, а не деньги. |
| `data.total_duration_ms` | `integer` — nullable | обяз. | Суммарная длительность полученного аудио в миллисекундах. Это длина результата, а не время, потраченное на генерацию. |
| `data.task_data` | `object` — nullable | обяз. | Входные данные задачи ровно в том виде, в каком их принял сервер: текст, ссылки на загруженные файлы, применённые настройки. Набор ключей зависит от `task_type`. |
| `data.result` | `object` — nullable | обяз. | Результат выполнения. `files[]` — основные файлы; `service_files[]` — вспомогательные (субтитры `.srt`/`.vtt`/`.lrc`, alignment) у TTS-заказов. Пути **абсолютные** и готовы к передаче в `POST /storage/url`. `null`, пока заказ не завершён, а также у упавшего заказа: подробностей ошибки в публичном контуре нет. |
| `data.created_at` | `string` — date-time — nullable | обяз. | Когда заказ создан, ISO 8601. |
| `data.updated_at` | `string` — date-time — nullable | обяз. | Когда заказ последний раз менялся, ISO 8601. Растёт на каждом переходе статуса — годится как дешёвый признак «что-то произошло». |
| `data.files_expire_at` | `string` — nullable | обяз. | Срок хранения файлов заказа. `files_expire_at` — момент удаления (`null`, если заказ ещё не завершён или файлы уже удалены); `files_expired` — файлов больше нет, скачивать нечего. |
| `data.files_expired` | `boolean` | обяз. | `true` — срок хранения истёк и файлы уже удалены: ссылку на них получить нельзя, заказ нужно создавать заново. |
| `data.retention` | `object` | обяз. | Сроки хранения по уровням файлов. Пофрагментные дорожки склеенного заказа удаляются раньше самого результата. |
| `data.retention.chunks` | `object` | обяз. | Срок жизни пофрагментных дорожек — ими работают правка пауз, пересборка финала и перегенерация отдельного фрагмента. |
| `data.retention.chunks.expires_at` | `string` | обяз. | Когда исчезнут пофрагментные дорожки, ISO 8601. До этого момента доступны правка пауз, пересборка и перегенерация отдельного фрагмента. `null` — заказ ещё не завершён (отсчёт не начат) либо фрагментов уже нет. |
| `data.retention.chunks.expired` | `boolean` | обяз. | `true` — пофрагментных дорожек больше нет: правка и пересборка отклоняются. Готовый результат при этом может быть ещё доступен — смотрите `retention.files`. |
| `data.retention.chunks.expires_early` | `boolean` | обяз. | `true` — фрагменты исчезнут раньше результата (заказ склеен в отдельный файл). `false` — фрагменты и есть результат, оба уровня истекают одновременно. |
| `data.retention.chunks.reason` | `string` — `chunks_purged` · `storage_expired` · `null` — nullable | обяз. | Почему фрагменты недоступны: `chunks_purged` — удалены по своему сроку, результат ещё на месте; `storage_expired` — удалены все файлы заказа. `null` — фрагменты доступны. |
| `data.retention.files` | `object` | обяз. | Срок жизни всех файлов заказа, включая результат. Дублирует поля `files_expire_at` / `files_expired` верхнего уровня. |
| `data.retention.files.expires_at` | `string` — nullable | обяз. | Когда будут удалены все файлы заказа, ISO 8601. То же значение, что в `files_expire_at` — поле верхнего уровня сохранено для совместимости. |
| `data.retention.files.expired` | `boolean` | обяз. | То же, что `files_expired`: файлов больше нет, скачивать нечего. |
| `data.eta_seconds` | `integer` — nullable | обяз. | Оценка оставшегося времени, в секундах — только пока заказ выполняется. У завершённого и у ещё не начатого `null`. |
| `data.eta_at` | `string` — date-time — nullable | обяз. | Ожидаемый момент готовности, ISO 8601 — тот же прогноз, что и `eta_seconds`, только абсолютным временем. |
| `data.completed_chunks` | `integer` — nullable | обяз. | Сколько исходных чанков уже готово. Повторы и перегенерации сюда не входят — иначе прогресс уезжал бы выше 100 %. |
| `data.total_chunks` | `integer` — nullable | обяз. | Сколько исходных чанков в заказе всего. Ноль означает, что разбиение ещё не выполнено. |
| `data.progress_percent` | `integer` — nullable | обяз. | Готовность в процентах, 0–100 — производная от `completed_chunks` и `total_chunks`, считать самому не нужно. |
| `data.stitching` | `boolean` | обяз. | `true` — идёт склейка аудио: результат ещё не финальный. Бывает и при `status = completed` — после перегенерации фрагмента финал пересобирается, и до конца склейки `result` указывает на прежнюю дорожку. Скачивать итог — когда `stitching = false`. |
| `data.paragraphs` | `array<object>` — nullable | обяз. | Сводка по абзацам: индекс, число фрагментов, общий статус, прогресс и аудиофайл (`result_file`) каждого абзаца. `null` — заказ создан в обычном режиме, ориентируйтесь на `items[]`. Чтобы абзацы появились, создавайте заказ с `config_override.generation_mode = paragraph` (подробности — в описании этого поля). |
| `data.paragraphs[].paragraph_index` | `integer` | обяз. | Номер абзаца, с нуля. |
| `data.paragraphs[].chunks_count` | `integer \| number` | обяз. | Сколько чанков попало в этот абзац. |
| `data.paragraphs[].completed_chunks` | `string \| integer` | обяз. | Сколько чанков абзаца уже готово. |
| `data.paragraphs[].status` | `string` | обяз. | Сводный статус абзаца: он выводится из статусов его чанков, а не хранится отдельно. Словарь свой, короче общего: `pending`, `in_progress`, `failed`, `completed` — заблокированный модерацией чанк тоже даёт `failed`. Считаются только исходные чанки, поэтому успешный повтор упавшего фрагмента статус абзаца НЕ меняет: смотрите на сам фрагмент в `items[]`. |
| `data.paragraphs[].progress_percent` | `integer` | обяз. | Готовность абзаца в процентах, 0–100. |
| `data.paragraphs[].result_file` | `string` — nullable | обяз. | Склеенное аудио абзаца целиком: абсолютный путь либо структура с путём и размером. Скачивается через `POST /storage/url`, как и остальные файлы заказа. `null` читается по-разному в зависимости от `chunks_count`: при `chunks_count = 1` собственного файла у абзаца нет и не будет — абзац это и есть тот единственный фрагмент, берите его `result_file` из `items[]` по тому же `paragraph_index`; при `chunks_count > 1` склейки ещё не было — многочанковый абзац получает файл ТОЛЬКО после неё, никогда заранее. |
| `data.items` | `array<OrderItem>` | — | Чанки заказа. Приходят в детальном ответе `GET /orders/{order}`; в списке `GET /orders` поля нет — за ними идите в `GET /orders/{order}/items`. |
| `data.items[].id` | `string` | обяз. | UUID чанка. Подставляется в пути `/orders/{order}/items/{item}/…`. |
| `data.items[].order_id` | `string` | обяз. | UUID заказа, которому принадлежит чанк. |
| `data.items[].item_type` | `string` | обяз. | Природа записи: `chunk` — исходный фрагмент, `retry` — бесплатный повтор упавшего фрагмента, `regeneration` — платная переделка готового. Повторы и перегенерации живут отдельными записями с тем же `chunk_index`: история попыток сохраняется целиком, а звучит в результате последняя. |
| `data.items[].chunk_index` | `integer` — nullable | обяз. | Порядковый номер фрагмента в заказе, с нуля. Задаёт порядок склейки итогового файла. |
| `data.items[].paragraph_index` | `string` | обяз. | Номер абзаца, к которому относится фрагмент, — заполняется только у исходных фрагментов абзацного заказа. `null` и в обычном режиме, и у записей повтора либо перегенерации: у них своей привязки к абзацу нет, её берут у родительского фрагмента через `parent_item_id`. Режим включается ключом `generation_mode` в `config_override` заказа. |
| `data.items[].parent_item_id` | `string` | обяз. | UUID исходного чанка — у записей `retry` и `regeneration`. У самого исходного чанка `null`. |
| `data.items[].original_text_length` | `integer` | обяз. | Длина текста, с которой фрагмент создавался. Служит потолком для `text` в `regenerate`. |
| `data.items[].current_text_length` | `integer` | обяз. | Длина актуального текста фрагмента: после перегенерации отличается от `original_text_length`. |
| `data.items[].price_units` | `integer` | обяз. | Стоимость фрагмента в **токенах** — это не деньги. Денежная сумма лежит у самого заказа, в его поле `price_units` (там LMC, здесь токены; поля называются одинаково, единицы разные). |
| `data.items[].consumed_units` | `integer` | обяз. | Сколько токенов фактически списано по этому фрагменту. У незавершённого фрагмента — 0. |
| `data.items[].remaining_locked` | `integer` | обяз. | Сколько токенов ещё зарезервировано под фрагмент. Обнуляется, когда фрагмент завершается или отменяется. |
| `data.items[].status` | `string` | обяз. | Состояние фрагмента: `pending` — ждёт воркера, `processing` — в работе, `completed` — готов, `failed` — техническая ошибка, `policy_flagged` — отклонён контентной политикой. Разница между двумя последними определяет способ лечения: `failed` чинится повтором как есть, `policy_flagged` — только переформулировкой текста, повтор с прежним будет отклонён снова. Попытка `policy_flagged` у ElevenLabs не бесплатна: она расходует ресурс провайдера и без результата, поэтому из суммы, которая вернулась бы за фрагмент, удерживается фиксированная плата за попытку (на заказах из квоты — эквивалент в токенах). Удерживается только из возвращаемого — сверх заблокированного по заказу не списывается ничего, баланс в минус не уходит. Денежная часть видна в истории операций как `policy_block_fee`; из квоты просто возвращается меньше токенов. |
| `data.items[].result_file` | `object \| string \| null` — nullable | обяз. | Файл готового фрагмента: абсолютный путь либо структура с путём и размером. Скачивается через `POST /storage/url`, как и файлы заказа. `null`, пока фрагмент не готов. |
| `data.items[].duration_ms` | `integer` — nullable | обяз. | Длительность полученного аудио в миллисекундах — длина записи, а не время генерации. У не-аудио задач `null`. |
| `data.items[].attempt_number` | `integer` | обяз. | Номер попытки для этого фрагмента, начиная с 1. Растёт с каждым повтором. |
| `data.items[].can_retry` | `boolean` | обяз. | Разрешён ли бесплатный повтор прямо сейчас. Учитывает статус, тип задачи и исчерпание попыток — проверять условия самому не нужно. |
| `data.items[].can_regenerate` | `boolean` | обяз. | Разрешена ли платная перегенерация прямо сейчас. Доступна только для завершённых фрагментов. |
| `data.items[].created_at` | `string` — date-time — nullable | обяз. | Когда фрагмент создан, ISO 8601. |
| `data.items[].updated_at` | `string` — date-time — nullable | обяз. | Когда фрагмент последний раз менялся, ISO 8601. |
| `data.items[].failure_reason` | `string` — nullable | — | Причина падения фрагмента для показа пользователю — локализованный текст на языке запроса, не машинный код (ветвиться по нему нельзя, формулировки меняются). Есть только у `failed` и `policy_flagged`; остальным, а также когда причину определить не удалось, приходит `null`. |
| `data.tokens_from_quota` | `integer` — nullable | — | Сколько из потраченных токенов покрыла квота подписки. `null` — из квоты не покрыто ничего. |
| `data.tokens_from_payg` | `integer` — nullable | — | Сколько токенов оплачено сверх квоты, из баланса LMC. `null` — доплаты не было. |
| `data.tokens_spent` | `integer` — nullable | — | Итог по двум предыдущим полям: сколько токенов списано за заказ (квота + доплата). Заказ, покрытый безлимитом подписки, и бесплатные версии сюда не входят — у безлимитного заказа поле `null`; объём генерации — `total_tokens`. Повторы (`retry`) не входят — они не тарифицируются заново. |
| `data.queue_position` | `integer` — nullable | — | Место заказа в очереди: сколько заказов стоит впереди, `0` — следующий. Поле есть у любого типа задачи, пока заказ ждёт свободного исполнителя (у `voice_search` — пока не готова проверка); когда работа началась, поля нет. Отсутствие ключа — «не в очереди», а не «позиция неизвестна». |
| `data.queue_wait_seconds` | `integer` — nullable | — | Оценка ожидания в очереди, в секундах. Считается только для поиска голоса; у остальных задач и пока нет статистики — `null`. Оценка, а не обещание: пересчитывается на каждый ответ. |

**Пример**

```json
{
  "success": true,
  "message": "string",
  "data": {
    "id": "string",
    "user_id": 1,
    "name": "string",
    "template": {
      "id": "string",
      "user_id": 1,
      "user": {
        "id": 1,
        "email": "string",
        "lang_code": "string",
        "timezone": "string",
        "display_currency": "string",
        "has_telegram": true,
        "created_at": "2026-07-17T12:34:56+00:00",
        "updated_at": "2026-07-17T12:34:56+00:00",
        "referral_code": "string",
        "referral": {
          "kind": "partner",
          "code": "string",
          "program_id": "string",
          "commission_rate": 1
        },
        "preferred_domain": "string",
        "email_verified_at": "string",
        "is_admin": true,
        "is_beta_tester": true,
        "allowed_models": "string",
        "referrer_id": 1,
        "deleted_at": "2026-07-17T12:34:56+00:00",
        "blocked_at": "2026-07-17T12:34:56+00:00",
        "is_blocked": true,
        "tickets_banned_at": "string",
        "is_tickets_banned": true,
        "tickets_ban_reason": "string",
        "voice_clone_banned_at": "string",
        "is_voice_clone_banned": true,
        "voice_clone_ban_reason": "string",
        "is_super_admin": true,
        "admin_permissions": [
          "string"
        ],
        "admin_roles": [
          {
            "name": null,
            "display_name": null
          }
        ],
        "referrer": null,
        "referral_link": "string",
        "active_referral_program": null,
        "wallets": [
          null
        ],
        "telegram": {
          "id": null,
          "telegram_id": null,
          "username": null,
          "first_name": null,
          "last_name": null,
          "is_bot_blocked": null,
          "created_at": null,
          "updated_at": null
        },
        "subscriptions": [
          null
        ],
        "order_settings": {
          "order_delay_enabled": null,
          "order_delay_seconds": null
        },
        "entitlements": [
          null
        ]
      },
      "slug": "string",
      "name": "string",
      "service_key": "string",
      "service": {
        "id": 1,
        "code": "string",
        "name": null,
        "display_name": "string",
        "label": null,
        "payg_access": "string",
        "billing_mode": null,
        "unit_asset_id": 1,
        "unit_asset": null,
        "required_entitlement_id": 1,
        "required_entitlement": null,
        "units_per_call": 1,
        "units_per_char": 1,
        "units_per_image": 1,
        "units_per_second": 1,
        "min_billable_chars": 1,
        "lumcoin_per_token": 1,
        "lumc_precision": 1,
        "price_lumc_minor": 1,
        "unit_size": 1,
        "uses_money_first_pricing": true,
        "rate_unit": "string",
        "display_category": "string",
        "is_premium": true,
        "display_order": 1,
        "metadata": "string",
        "is_active": true,
        "maintenance_mode": true,
        "access_level": "string",
        "maintenance_auto_resume": true,
        "maintenance_started_at": "string",
        "maintenance_note": "string",
        "config_schema": "string",
        "default_config": "string",
        "validation_schema": "string",
        "routing_config": "string",
        "task_types": "string",
        "default_task_type": "string",
        "features": "string",
        "cost_config": "string",
        "created_at": "2026-07-17T12:34:56+00:00",
        "updated_at": "2026-07-17T12:34:56+00:00"
      },
      "config": [],
      "is_public": true,
      "folder_id": "string",
      "folder": {
        "id": "string",
        "user_id": 1,
        "user": {
          "id": null,
          "email": null,
          "lang_code": null,
          "timezone": null,
          "display_currency": null,
          "has_telegram": null,
          "created_at": null,
          "updated_at": null,
          "referral_code": null,
          "referral": null,
          "preferred_domain": null,
          "email_verified_at": null,
          "is_admin": null,
          "is_beta_tester": null,
          "allowed_models": null,
          "referrer_id": null,
          "deleted_at": null,
          "blocked_at": null,
          "is_blocked": null,
          "tickets_banned_at": null,
          "is_tickets_banned": null,
          "tickets_ban_reason": null,
          "voice_clone_banned_at": null,
          "is_voice_clone_banned": null,
          "voice_clone_ban_reason": null,
          "is_super_admin": null,
          "admin_permissions": null,
          "admin_roles": null,
          "referrer": null,
          "referral_link": null,
          "active_referral_program": null,
          "wallets": null,
          "telegram": null,
          "subscriptions": null,
          "order_settings": null,
          "entitlements": null
        },
        "name": "string",
        "templates": [
          null
        ],
        "created_at": "2026-07-17T12:34:56+00:00",
        "updated_at": "2026-07-17T12:34:56+00:00"
      },
      "created_at": "2026-07-17T12:34:56+00:00",
      "updated_at": "2026-07-17T12:34:56+00:00"
    },
    "template_id": "string",
    "task_type": "tts",
    "status": "created",
    "price_units": 1,
    "price_formatted": 1,
    "currency_asset": {
      "id": 1,
      "code": "string",
      "kind": "money",
      "precision": 1,
      "name": null,
      "is_active": true,
      "is_default": true,
      "default_balance": 1,
      "deleted_at": "2026-07-17T12:34:56+00:00",
      "created_at": "2026-07-17T12:34:56+00:00",
      "updated_at": "2026-07-17T12:34:56+00:00"
    },
    "total_tokens": 1,
    "total_duration_ms": 1,
    "": {
      "queue_position": 1,
      "queue_wait_seconds": 1
    },
    "task_data": [
      "string"
    ],
    "result": [
      "string"
    ],
    "created_at": "2026-07-17T12:34:56+00:00",
    "updated_at": "2026-07-17T12:34:56+00:00",
    "files_expire_at": "string",
    "files_expired": true,
    "retention": {
      "chunks": {
        "expires_at": "string",
        "expired": true,
        "expires_early": true,
        "reason": "chunks_purged"
      },
      "files": {
        "expires_at": "string",
        "expired": true
      }
    },
    "eta_seconds": "string",
    "eta_at": "string",
    "completed_chunks": "string",
    "total_chunks": "string",
    "progress_percent": "string",
    "stitching": true,
    "paragraphs": [
      {
        "paragraph_index": 1,
        "chunks_count": 1,
        "completed_chunks": "string",
        "status": "string",
        "progress_percent": 1,
        "result_file": "string"
      }
    ],
    "dubbing_source": {
      "voice_id": "string",
      "eligible": true
    },
    "source": "bot",
    "user": {
      "id": 1,
      "email": "string",
      "lang_code": "string",
      "timezone": "string",
      "display_currency": "string",
      "has_telegram": true,
      "created_at": "2026-07-17T12:34:56+00:00",
      "updated_at": "2026-07-17T12:34:56+00:00",
      "referral_code": "string",
      "referral": {
        "kind": "partner",
        "code": "string",
        "program_id": "string",
        "commission_rate": 1
      },
      "preferred_domain": "string",
      "email_verified_at": "string",
      "is_admin": true,
      "is_beta_tester": true,
      "allowed_models": "string",
      "referrer_id": 1,
      "deleted_at": "2026-07-17T12:34:56+00:00",
      "blocked_at": "2026-07-17T12:34:56+00:00",
      "is_blocked": true,
      "tickets_banned_at": "string",
      "is_tickets_banned": true,
      "tickets_ban_reason": "string",
      "voice_clone_banned_at": "string",
      "is_voice_clone_banned": true,
      "voice_clone_ban_reason": "string",
      "is_super_admin": true,
      "admin_permissions": [
        "string"
      ],
      "admin_roles": [
        {
          "name": "string",
          "display_name": "string"
        }
      ],
      "referrer": null,
      "referral_link": "string",
      "active_referral_program": {
        "id": 1,
        "code": "string",
        "name": "string",
        "inviter_reward_percent": 1,
        "invitee_reward_percent": 1,
        "is_default": true,
        "is_active": true,
        "inviter_reward_wallet_purpose": "string",
        "invitee_reward_wallet_purpose": "string",
        "reward_on": null,
        "rules": "string",
        "created_at": "2026-07-17T12:34:56+00:00",
        "updated_at": "2026-07-17T12:34:56+00:00"
      },
      "wallets": [
        {
          "id": 1,
          "user_id": 1,
          "asset_id": 1,
          "purpose": "string",
          "balance": 1,
          "locked_balance": 1,
          "balance_formatted": 1,
          "locked_balance_formatted": 1,
          "balance_converted": {
            "currency": null,
            "amount": null,
            "symbol": null,
            "precision": null
          },
          "asset": null,
          "user": null,
          "deleted_at": "2026-07-17T12:34:56+00:00",
          "created_at": "2026-07-17T12:34:56+00:00",
          "updated_at": "2026-07-17T12:34:56+00:00",
          "system_key": "string"
        }
      ],
      "telegram": {
        "id": 1,
        "telegram_id": "string",
        "username": "string",
        "first_name": "string",
        "last_name": "string",
        "is_bot_blocked": true,
        "created_at": "2026-07-17T12:34:56+00:00",
        "updated_at": "2026-07-17T12:34:56+00:00"
      },
      "subscriptions": [
        {
          "id": 1,
          "user_id": 1,
          "user": null,
          "status": null,
          "billing_anchor_at": "2026-07-17T12:34:56+00:00",
          "current_period_start": "2026-07-17T12:34:56+00:00",
          "current_period_end": "2026-07-17T12:34:56+00:00",
          "canceled_at": "2026-07-17T12:34:56+00:00",
          "items": [
            null
          ],
          "created_at": "2026-07-17T12:34:56+00:00",
          "updated_at": "2026-07-17T12:34:56+00:00"
        }
      ],
      "order_settings": {
        "order_delay_enabled": true,
        "order_delay_seconds": 1
      },
      "entitlements": [
        {
          "id": 1,
          "user_id": 1,
          "entitlement_id": 1,
          "entitlement": null,
          "source_subscription_item_id": 1,
          "starts_at": "2026-07-17T12:34:56+00:00",
          "ends_at": "2026-07-17T12:34:56+00:00",
          "status": null,
          "created_at": "2026-07-17T12:34:56+00:00",
          "is_unlimited": "string"
        }
      ]
    },
    "execution_meta": "string",
    "routing": {
      "nominal_service_key": "string",
      "effective_service_key": "string",
      "is_rerouted": true
    },
    "refunds": [
      {
        "id": 1,
        "user_id": 1,
        "user": {
          "id": "string",
          "email": "string",
          "name": "string"
        },
        "admin_id": 1,
        "admin": {
          "id": "string",
          "email": "string",
          "name": "string"
        },
        "type": "string",
        "type_label": "string",
        "status": "string",
        "status_label": "string",
        "invoice_id": 1,
        "payment_id": 1,
        "order_id": "string",
        "order": {
          "id": "string",
          "status": "string",
          "task_type": "string"
        },
        "refund_amount": 1,
        "refund_amount_formatted": 1,
        "currency": {
          "id": "string",
          "code": "string",
          "precision": 1,
          "is_provider_currency": true
        },
        "units_amount": 1,
        "units_asset": {
          "id": "string",
          "code": "string"
        },
        "reason": "string",
        "admin_note": "string",
        "metadata": "string",
        "completed_at": "string",
        "created_at": "string",
        "updated_at": "string"
      }
    ],
    "compensation": {
      "kind": "string",
      "is_partial": null
    },
    "items": [
      []
    ],
    "chunks": [
      {
        "chunk_index": 1,
        "item_id": "string",
        "status": "string",
        "failure_reason": "string",
        "text_length": "string",
        "can_regenerate": "string",
        "can_retry": "string",
        "versions_count": 1,
        "current": {
          "item_id": "string",
          "version": 1,
          "type": "string",
          "result_file": "string",
          "duration_ms": 1,
          "service_files": "string",
          "created_at": "string",
          "tokens": 1,
          "paid_with": "mixed",
          "quota_tokens": 1,
          "payg_tokens": 1,
          "lmc_minor": 1,
          "lmc": 1
        },
        "history": [
          "string"
        ],
        "attempts": [
          {
            "item_id": "string",
            "type": "string",
            "status": "string",
            "attempt_number": 1,
            "created_at": "string",
            "failure_reason": "string",
            "admin_free": true,
            "tokens": 1,
            "paid_with": "string",
            "quota_tokens": 1,
            "payg_tokens": 1,
            "lmc_minor": 1,
            "lmc": 1
          }
        ]
      }
    ],
    "operations": [
      {
        "id": "string",
        "type": "string",
        "status": "string",
        "result_file": "string",
        "paragraph_index": "string",
        "created_at": "string",
        "updated_at": "string"
      }
    ]
  }
}
```

### 401 — Невалидный или отсутствующий X-API-KEY

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |
| `data` | `null` — nullable | обяз. | Всегда `null`, когда запрос отклонён до обработки. |

**Пример**

```json
{
  "success": false,
  "message": "API key is missing. Provide it in the X-API-KEY header.",
  "data": null
}
```

### 402 — Не хватает денег на добор сверх квоты (reason=insufficient_balance) или тариф добор запрещает (insufficient_allowance) — как у создания заказа

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |
| `reason` | `string` — `insufficient_balance` · `insufficient_allowance` · `payg_topup_required` | обяз. | Машиночитаемая причина отказа — по ней ветвите обработку, а не по тексту сообщения. |
| `error_code` | `string` — `insufficient_balance` · `insufficient_allowance` · `payg_topup_required` | обяз. | Тот же машинный код, что в `reason`, — второе имя поля. Значения всегда совпадают; ветвитесь по любому из них. |
| `shortfall_tokens` | `integer` | — | Сколько токенов не покрыла квота подписки — именно они оплачиваются из LMC. |
| `shortfall_lmc` | `number` | — | Стоимость доплаты в LMC, готовая к показу пользователю. |
| `shortfall_lmc_minor` | `integer` | — | Та же сумма в минимальных единицах LMC — для точных расчётов без потери копеек. |
| `quote_token` | `string` — nullable | — | Подписанная котировка цены: верните её без изменений в повторном запросе вместе с `confirm_payg_topup: true`. |
| `expires_at` | `string` — date-time — nullable | — | До этого момента цена зафиксирована. Позже — повторите запрос и получите новую котировку. |

**Пример**

```json
{
  "success": false,
  "message": "Insufficient balance to cover the part of the order beyond the subscription quota.",
  "reason": "insufficient_balance",
  "error_code": "insufficient_balance"
}
```

### 403 — У ключа нет права orders.write

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |

**Пример**

```json
{
  "success": false,
  "message": "This API key does not have permission to perform this action."
}
```

### 404 — Заказ не найден или принадлежит не владельцу ключа

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `message` | `string` | обяз. | Error overview. |

**Пример**

```json
{
  "success": false,
  "message": "Resource not found."
}
```

### 409 — reason=duplicate_order — тот же дубль уже создан меньше минуты назад

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |
| `reason` | `string` — `quote_mismatch` | обяз. | Машиночитаемая причина отказа — по ней ветвите обработку, а не по тексту сообщения. |
| `error_code` | `string` — `quote_mismatch` | обяз. | Тот же машинный код, что в `reason`, — второе имя поля. Значения всегда совпадают; ветвитесь по любому из них. |
| `actual_lmc_minor` | `integer` | обяз. | Во сколько добор обходится сейчас (минимальные единицы LMC). |
| `quoted_lmc_minor` | `integer` | обяз. | Цена, на которую вы согласились ранее (минимальные единицы LMC). |

**Пример**

```json
{
  "success": false,
  "message": "The pay-as-you-go quote is stale — request a fresh one.",
  "reason": "quote_mismatch",
  "error_code": "quote_mismatch",
  "actual_lmc_minor": 380000000,
  "quoted_lmc_minor": 360000000
}
```

### 422 — reason=dub_source_unavailable (не готовая озвучка Cartesia/ElevenLabs, файлы истекли, нет таймингов, абзацный заказ, над исходником идёт перегенерация или склейка); dub_source_too_long (в теле source_chars, max_source_chars); dub_same_language; service_not_found (дубляж владельцу ключа недоступен); ошибки валидации полей

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `message` | `string` | обяз. | Сводка ошибок валидации словами, на языке ответа (`X-Locale`). |
| `errors` | `object` | обяз. | Разбор по полям: ключ — поле запроса, значение — список претензий к нему. |
| `errors.*` | `array<string>` — произвольные ключи | — |  |

**Пример**

```json
{
  "message": "string",
  "errors": {
    "key": [
      "string"
    ]
  }
}
```

### 429 — Превышена токен-квота ключа, reason=limit_exceeded — исчерпан usage-лимит подписки, или reason=concurrency_limit_exceeded — заняты слоты одновременных задач (Retry-After)

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |
| `reason` | `string` | обяз. | Машиночитаемая причина отказа — по ней ветвите обработку, а не по тексту сообщения. |
| `error_code` | `string` | обяз. | Тот же машинный код, что в `reason`, — второе имя поля. Значения всегда совпадают; ветвитесь по любому из них. |
| `retry_after` | `integer` — nullable | — | Через сколько секунд имеет смысл повторить запрос (то же значение — в заголовке `Retry-After`). |

**Пример**

```json
{
  "success": false,
  "message": "Too many attempts. Please wait a moment and try again.",
  "reason": "rate_limit_exceeded",
  "error_code": "rate_limit_exceeded",
  "retry_after": 30
}
```

### 503 — Приём дубляжа этого вида временно приостановлен

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |

**Пример**

```json
{
  "success": false,
  "message": "Service temporarily unavailable."
}
```

---

- Эта же страница в браузере: https://lumean.app/developers/docs/api/post-orders-order-dub
- Машинный справочник целиком: https://api.lumean.app/docs/llm.md
