POST /orders /{order} /retry
Создаёт НОВЫЙ заказ с теми же параметрами (полный retry завершённого заказа).
Условия:
- Исходный заказ в статусе
completedилиresult_delivered, безfailed-чанков.
Настройки нового заказа — снимок ИСХОДНОГО: конфиг шаблона на момент его создания и
тот же config_override, а не текущее состояние шаблона; правка и удаление шаблона на
повтор не влияют. Заказы, созданные до конца сентября 2026 года, снимка не имеют и
повторяются по текущему шаблону. Если сохранённые настройки больше не проходят текущую
схему сервиса — 400 с reason: retry_config_outdated: создайте заказ заново через
POST /orders.
Это НЕ способ дотянуть
partially_completed-заказ: такой статус здесь не принимается. Частично выполненный заказ доводят поштучно — item-levelPOST /orders/{order}/items/{item}/retryпо каждомуpolicy_flagged/failedчанку.
Биллинг: это полностью новый заказ с новой блокировкой средств. Новый заказ
привязывается к вашему API-ключу, его стоимость учитывается в
токен-квоте ключа (pre-check → 429 при превышении, заказ не создаётся).
Требуемое право ключа: orders.write.
На этой странице(5)
Параметры
Поля ввода живут прямо в строке запроса: подставьте значение — и получите готовый URL. Ниже — тип, обязательность и допустимые значения каждого параметра.
- stringв путиобязательный
UUID заказа — 36 символов вида
9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c, не число.Берётся из поля
id: его возвращаетPOST /ordersпри создании иGET /ordersв списке. Чужой заказ по вашему ключу не откроется — придёт404.Значение подставляется прямо в строку запроса выше.
Тело запроса
Тело не обязательно. Поля нужны только для подтверждения PAYG-добора после ответа 402
в режиме отката к явному подтверждению; в норме добор списывается автоматически.
{}Поля
Согласие на PAYG-добор для нового заказа — только в режиме отката к явному подтверждению (иначе игнорируется). Семантика та же, что у POST /orders: действует только вместе со свежим quote_token из ответа 402.
Котировка добора из ответа 402 этого же запроса (только режим отката). Живёт ~60 секунд.
Возможные ответы
201Создан новый заказ с параметрами исходного. Исходный заказ не меняется.
Создан новый заказ с параметрами исходного. Исходный заказ не меняется.
{
"success": true,
"message": "Order retry created successfully.",
"data": {
"id": "d5e6f7a8-9b0c-4d1e-8f2a-3b4c5d6e7f8a",
"user_id": 501,
"template_id": "7e2a4c1d-8b3f-4a5e-9c6d-1f2e3a4b5c6d",
"task_type": "tts",
"status": "created",
"price_units": 420,
"total_tokens": 0,
"task_data": {
"text": "Welcome to our platform! This narration greets every new listener.",
"total_length": 420
},
"result": null,
"created_at": "2026-07-17T16:00:00+00:00",
"updated_at": "2026-07-17T16:00:00+00:00",
"eta_seconds": null,
"eta_at": null,
"completed_chunks": 0,
"total_chunks": 2,
"progress_percent": 0
}
}Признак успеха. Решение принимайте по HTTP-коду: у любого ответа 2xx здесь true, а ошибка приходит телом другой формы, где этого поля может не быть вовсе.
Пояснение для человека, на языке аккаунта. Показать пользователю можно; разбирать программно — нет: формулировки меняются без предупреждения и кодом ошибки не являются.
dataобязательноеНовый заказ с теми же параметрами — у него свой id. Исходный заказ не меняется.
OrderOrder
Новый заказ с теми же параметрами — у него свой id. Исходный заказ не меняется.
UUID заказа. Его подставляют в пути /orders/{order}/… и передают в POST /orders/{order}/retry.
ID владельца заказа. У заказов, созданных по API-ключу, это всегда владелец ключа — чужой заказ по ключу не увидеть.
Название заказа: из него берутся имя скачиваемого файла и имя ZIP-архива.
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, и правка шаблона его меняет.
TemplateTemplate
Шаблон, по которому создан заказ. Приходит только у заказов с 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, и правка шаблона его меняет.
UUID шаблона. Его кладут в template_id при создании заказа.
ID владельца шаблона.
Короткий публичный идентификатор для расшаривания. null у шаблона, которым не делились.
Название шаблона — только для человека, на поведение генерации не влияет.
Код сервиса, по схеме которого валидируется config: elevenlabs, lumimg и т. д.
Сервис шаблона справочно: название и тарификация, без схем конфигурации. null означает, что сервиса с таким кодом больше нет.
Настройки генерации: голос, модель, скорость и прочее — набор ключей задаёт сервис. Допустимые значения смотрите в GET /templates/config-options?service=<код>, значение вне схемы отклоняется с 422. В заказе (template в GET /orders/{order}) это настройки самого заказа — снимок на момент его создания с config_override, а не текущий конфиг шаблона (у заказов, созданных до конца сентября 2026 года, — текущий конфиг шаблона с config_override).
Опубликован ли шаблон в общем каталоге.
UUID папки, в которой лежит шаблон, либо null для корня. Структура папок видна в GET /templates/browse.
Когда шаблон создан, ISO 8601.
Когда шаблон последний раз менялся, ISO 8601.
UUID использованного шаблона либо null, если заказ создан без шаблона.
Тип задачи — он определяет, что лежит в task_data и что придёт в result.
Текущее состояние заказа. Терминальные — completed, failed, cancelled,
compensated; опрашивать заказ дальше смысла нет.
partially_completed — часть чанков готова, часть упала: файлы уже можно
забирать, а сбойные фрагменты перезапускать через
POST /orders/{order}/items/retry-failed.
Заблокированная под заказ сумма в минимальных единицах LMC. Показывать это число как есть нельзя: реальное значение — price_units / 10^precision, где precision берётся из актива рядом. Готовое к показу значение лежит в соседнем decimal-поле.
Та же сумма, что и price_units, но в целых LMC — готова к показу. null, пока стоимость не зафиксирована.
currency_assetобязательноеАктив суммы — всегда LMC. Его precision нужен, чтобы перевести минимальные единицы в реальное значение.
AssetAsset
Актив суммы — всегда LMC. Его precision нужен, чтобы перевести минимальные единицы в реальное значение.
Внутренний идентификатор актива.
Код актива: LUMC — внутренняя валюта, TOKEN — токены генерации.
Вид актива: деньги или расходуемые единицы. От него зависит, где сумма считается платежом, а где — расходом квоты.
Число десятичных знаков. Ключевое поле: любая целая сумма этого актива делится на 10^precision, чтобы получить реальное значение. Не считайте, что делитель равен 100.
Название актива для показа, на языке аккаунта.
Когда актив выведен из обращения, ISO 8601. null у действующего.
Когда актив заведён, ISO 8601.
Когда актив последний раз менялся, ISO 8601.
Полная стоимость заказа в токенах: исходные чанки плюс все повторы и перегенерации. Это единица квоты, а не деньги.
Суммарная длительность полученного аудио в миллисекундах. Это длина результата, а не время, потраченное на генерацию.
Входные данные задачи ровно в том виде, в каком их принял сервер: текст, ссылки на загруженные файлы, применённые настройки. Набор ключей зависит от task_type.
Результат выполнения. files[] — основные файлы; service_files[] —
вспомогательные (субтитры .srt/.vtt/.lrc, alignment) у TTS-заказов.
Пути абсолютные и готовы к передаче в POST /storage/url.
null, пока заказ не завершён, а также у упавшего заказа: подробностей
ошибки в публичном контуре нет.
Когда заказ создан, ISO 8601.
Когда заказ последний раз менялся, ISO 8601. Растёт на каждом переходе статуса — годится как дешёвый признак «что-то произошло».
Срок хранения файлов заказа. files_expire_at — момент удаления (null, если заказ ещё не завершён или файлы уже удалены); files_expired — файлов больше нет, скачивать нечего.
true — срок хранения истёк и файлы уже удалены: ссылку на них получить нельзя, заказ нужно создавать заново.
retentionобязательноеСроки хранения по уровням файлов. Пофрагментные дорожки склеенного заказа удаляются раньше самого результата.
object
Сроки хранения по уровням файлов. Пофрагментные дорожки склеенного заказа удаляются раньше самого результата.
chunksобязательноеСрок жизни пофрагментных дорожек — ими работают правка пауз, пересборка финала и перегенерация отдельного фрагмента.
object
Срок жизни пофрагментных дорожек — ими работают правка пауз, пересборка финала и перегенерация отдельного фрагмента.
Когда исчезнут пофрагментные дорожки, ISO 8601. До этого момента доступны правка пауз, пересборка и перегенерация отдельного фрагмента. null — заказ ещё не завершён (отсчёт не начат) либо фрагментов уже нет.
true — пофрагментных дорожек больше нет: правка и пересборка отклоняются. Готовый результат при этом может быть ещё доступен — смотрите retention.files.
true — фрагменты исчезнут раньше результата (заказ склеен в отдельный файл). false — фрагменты и есть результат, оба уровня истекают одновременно.
Почему фрагменты недоступны: chunks_purged — удалены по своему сроку, результат ещё на месте; storage_expired — удалены все файлы заказа. null — фрагменты доступны.
filesобязательноеСрок жизни всех файлов заказа, включая результат. Дублирует поля files_expire_at / files_expired верхнего уровня.
object
Срок жизни всех файлов заказа, включая результат. Дублирует поля files_expire_at / files_expired верхнего уровня.
Когда будут удалены все файлы заказа, ISO 8601. То же значение, что в files_expire_at — поле верхнего уровня сохранено для совместимости.
То же, что files_expired: файлов больше нет, скачивать нечего.
Оценка оставшегося времени, в секундах — только пока заказ выполняется. У завершённого и у ещё не начатого null.
Ожидаемый момент готовности, ISO 8601 — тот же прогноз, что и eta_seconds, только абсолютным временем.
Сколько исходных чанков уже готово. Повторы и перегенерации сюда не входят — иначе прогресс уезжал бы выше 100 %.
Сколько исходных чанков в заказе всего. Ноль означает, что разбиение ещё не выполнено.
Готовность в процентах, 0–100 — производная от completed_chunks и total_chunks, считать самому не нужно.
true — идёт склейка аудио: результат ещё не финальный. Бывает и при status = completed — после перегенерации фрагмента финал пересобирается, и до конца склейки result указывает на прежнюю дорожку. Скачивать итог — когда stitching = false.
paragraphsобязательноеСводка по абзацам: индекс, число фрагментов, общий статус и прогресс каждого абзаца. null — заказ создан в обычном режиме, ориентируйтесь на items[]. Чтобы абзацы появились, создавайте заказ с config_override.generation_mode = paragraph (подробности — в описании этого поля).
может быть nullarray<object>
Сводка по абзацам: индекс, число фрагментов, общий статус и прогресс каждого абзаца. null — заказ создан в обычном режиме, ориентируйтесь на items[]. Чтобы абзацы появились, создавайте заказ с config_override.generation_mode = paragraph (подробности — в описании этого поля).
Номер абзаца, с нуля.
Сколько чанков попало в этот абзац.
Сколько чанков абзаца уже готово.
Сводный статус абзаца: он выводится из статусов его чанков, а не хранится отдельно. Словарь свой, короче общего: pending, in_progress, failed, completed — заблокированный модерацией чанк тоже даёт failed. Считаются только исходные чанки, поэтому успешный повтор упавшего фрагмента статус абзаца НЕ меняет: смотрите на сам фрагмент в items[].
Готовность абзаца в процентах, 0–100.
Склеенное аудио абзаца целиком: абсолютный путь либо структура с путём и размером. Скачивается через POST /storage/url, как и остальные файлы заказа. null читается по-разному в зависимости от chunks_count: при chunks_count = 1 собственного файла у абзаца нет и не будет — абзац это и есть тот единственный фрагмент, берите его result_file из items[] по тому же paragraph_index; при chunks_count > 1 склейки ещё не было — многочанковый абзац получает файл ТОЛЬКО после неё, никогда заранее.
itemsнеобязательноеЧанки заказа. Приходят в детальном ответе GET /orders/{order}; в списке GET /orders поля нет — за ними идите в GET /orders/{order}/items.
array<OrderItem>OrderItem
Чанки заказа. Приходят в детальном ответе GET /orders/{order}; в списке GET /orders поля нет — за ними идите в GET /orders/{order}/items.
UUID чанка. Подставляется в пути /orders/{order}/items/{item}/….
UUID заказа, которому принадлежит чанк.
Природа записи: chunk — исходный фрагмент, retry — бесплатный повтор
упавшего фрагмента, regeneration — платная переделка готового.
Повторы и перегенерации живут отдельными записями с тем же chunk_index:
история попыток сохраняется целиком, а звучит в результате последняя.
Порядковый номер фрагмента в заказе, с нуля. Задаёт порядок склейки итогового файла.
Номер абзаца, к которому относится фрагмент, — заполняется только у исходных фрагментов абзацного заказа. null и в обычном режиме, и у записей повтора либо перегенерации: у них своей привязки к абзацу нет, её берут у родительского фрагмента через parent_item_id. Режим включается ключом generation_mode в config_override заказа.
UUID исходного чанка — у записей retry и regeneration. У самого исходного чанка null.
Длина текста, с которой фрагмент создавался. Служит потолком для text в regenerate.
Длина актуального текста фрагмента: после перегенерации отличается от original_text_length.
Стоимость фрагмента в токенах — это не деньги. Денежная сумма лежит у самого заказа, в его поле price_units (там LMC, здесь токены; поля называются одинаково, единицы разные).
Сколько токенов фактически списано по этому фрагменту. У незавершённого фрагмента — 0.
Сколько токенов ещё зарезервировано под фрагмент. Обнуляется, когда фрагмент завершается или отменяется.
Состояние фрагмента: pending — ждёт воркера, processing — в работе,
completed — готов, failed — техническая ошибка, policy_flagged —
отклонён контентной политикой.
Разница между двумя последними определяет способ лечения: failed чинится
повтором как есть, policy_flagged — только переформулировкой текста,
повтор с прежним будет отклонён снова.
Файл готового фрагмента: абсолютный путь либо структура с путём и размером. Скачивается через POST /storage/url, как и файлы заказа. null, пока фрагмент не готов.
Длительность полученного аудио в миллисекундах — длина записи, а не время генерации. У не-аудио задач null.
Номер попытки для этого фрагмента, начиная с 1. Растёт с каждым повтором.
Разрешён ли бесплатный повтор прямо сейчас. Учитывает статус, тип задачи и исчерпание попыток — проверять условия самому не нужно.
Разрешена ли платная перегенерация прямо сейчас. Доступна только для завершённых фрагментов.
Когда фрагмент создан, ISO 8601.
Когда фрагмент последний раз менялся, ISO 8601.
Причина падения в машиночитаемом виде — есть только у failed и policy_flagged. Остальным приходит null.
Сколько из потраченных токенов покрыла квота подписки. null — из квоты не покрыто ничего.
Сколько токенов оплачено сверх квоты, из баланса LMC. null — доплаты не было.
Итог по двум предыдущим полям: сколько токенов списано за заказ (квота + доплата). Заказ, покрытый безлимитом подписки, и бесплатные версии сюда не входят — у безлимитного заказа поле null; объём генерации — total_tokens. Повторы (retry) не входят — они не тарифицируются заново.
Место в очереди — только у задач поиска голоса (voice_search), которые обслуживаются по одной. У остальных типов задач поля нет.
Оценка ожидания в очереди поиска голоса, в секундах. Оценка, а не обещание: пересчитывается на каждый ответ.
400Невозможно выполнить retry: reason=invalid_order_status (исходный заказ не completed/result_delivered), has_failed_items (в заказе есть упавшие фрагменты) или retry_config_outdated (настройки исходной генерации — снимок шаблона и config_override — не проходят текущую схему сервиса; создайте новый заказ)
Невозможно выполнить retry: reason=invalid_order_status (исходный заказ не completed/result_delivered), has_failed_items (в заказе есть упавшие фрагменты) или retry_config_outdated (настройки исходной генерации — снимок шаблона и config_override — не проходят текущую схему сервиса; создайте новый заказ)
{
"success": false,
"message": "This order contains items that failed and cannot be repeated.",
"reason": "has_failed_items",
"error_code": "has_failed_items"
}Всегда false у ошибок.
Причина отказа словами, на языке аккаунта. Для показа пользователю; ветвиться по ней нельзя — формулировки меняются.
Разбор по полям — только у ошибок валидации (422): ключ соответствует полю запроса, значение — список претензий к нему. У остальных кодов приходит null: разбирать нечего, причина целиком в message.
401Невалидный или отсутствующий X-API-KEY
Невалидный или отсутствующий X-API-KEY
{
"success": false,
"message": "API key is missing. Provide it in the X-API-KEY header.",
"data": null
}Всегда false в ответах об ошибке.
Текст ошибки на языке ключа (задаётся заголовком X-Locale).
Всегда null, когда запрос отклонён до обработки.
402Не хватает денег на новый заказ сверх квоты подписки (reason: insufficient_balance) — биллинг тот же, что при создании. Только в режиме отката: payg_topup_required — получите quote_token и повторите запрос с confirm_payg_topup: true.
Не хватает денег на новый заказ сверх квоты подписки (reason: insufficient_balance) — биллинг тот же, что при создании. Только в режиме отката: payg_topup_required — получите quote_token и повторите запрос с confirm_payg_topup: true.
{
"success": false,
"message": "Insufficient balance to cover the part of the order beyond the subscription quota.",
"reason": "insufficient_balance",
"error_code": "insufficient_balance"
}Всегда false в ответах об ошибке.
Текст ошибки на языке ключа (задаётся заголовком X-Locale).
Машиночитаемая причина отказа — по ней ветвите обработку, а не по тексту сообщения.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают; ветвитесь по любому из них.
Сколько токенов не покрыла квота подписки — именно они оплачиваются из LMC.
Стоимость доплаты в LMC, готовая к показу пользователю.
Та же сумма в минимальных единицах LMC — для точных расчётов без потери копеек.
Подписанная котировка цены: верните её без изменений в повторном запросе вместе с confirm_payg_topup: true.
До этого момента цена зафиксирована. Позже — повторите запрос и получите новую котировку.
403Нет доступа к заказу или у ключа нет права orders.write
Нет доступа к заказу или у ключа нет права orders.write
{
"success": false,
"message": "This API key does not have permission to perform this action."
}Error overview.
409Только в режиме отката к явному подтверждению: котировка добора устарела (reason=quote_mismatch) — запросите 402 заново
Только в режиме отката к явному подтверждению: котировка добора устарела (reason=quote_mismatch) — запросите 402 заново
{
"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
}Всегда false в ответах об ошибке.
Текст ошибки на языке ключа (задаётся заголовком X-Locale).
Машиночитаемая причина отказа — по ней ветвите обработку, а не по тексту сообщения.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают; ветвитесь по любому из них.
Во сколько добор обходится сейчас (минимальные единицы LMC).
Цена, на которую вы согласились ранее (минимальные единицы LMC).
422Ошибка валидации. Поля с ошибками перечислены в errors.
Ошибка валидации. Поля с ошибками перечислены в errors.
{
"message": "string",
"errors": {}
}Errors overview.
errorsобязательноеA detailed description of each field that failed validation.
object
A detailed description of each field that failed validation.
429Превышена токен-квота ключа либо reason=limit_exceeded — исчерпан usage-лимит подписки
Превышена токен-квота ключа либо reason=limit_exceeded — исчерпан usage-лимит подписки
{
"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
}Всегда false в ответах об ошибке.
Текст ошибки на языке ключа (задаётся заголовком X-Locale).
Машиночитаемая причина отказа — по ней ветвите обработку, а не по тексту сообщения.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают; ветвитесь по любому из них.
Через сколько секунд имеет смысл повторить запрос (то же значение — в заголовке Retry-After).
События, которые это порождает
Ход выполнения приезжает по WebSocket: опрашивать заказ в цикле не обязательно. Подписка требует того же права, что и чтение заказов.
Рядом
Скормить страницу ИИ
спека 0.0.1