POST /orders /{order} /items /{item} /regenerate
Перегенерирует завершённый (completed) элемент заказа с новым текстом.
Биллинг: платная операция — блокирует НОВЫЕ средства. Стоимость учитывается
в токен-квоте ключа (pre-check до загрузки текста → 429 при превышении,
перегенерация не выполняется; запись фактического объёма — после успеха).
Поле text обязательно. Предел длины — ёмкость фрагмента (max_billable_length
из GET .../items/{item}/text); длиннее — 422 с reason: text_over_capacity.
Стоимость считается по всей новой длине. Бесплатны и места не занимают только
наши паузы {{pause=2s}}; <break .../> и указания диктору в […] ([шёпот]) —
синтаксис провайдера: они тарифицируются и входят в лимит (llm.md §8.3).
В отличие от retry, regenerate применим только к уже завершённому (completed)
чанку и стоит новых токенов.
Требуемое право ключа: orders.write. Недоступно для sfx/music.
На этой странице(5)
Параметры
Поля ввода живут прямо в строке запроса: подставьте значение — и получите готовый URL. Ниже — тип, обязательность и допустимые значения каждого параметра.
- stringв путиобязательный
UUID заказа — 36 символов вида
9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c, не число.Берётся из поля
id: его возвращаетPOST /ordersпри создании иGET /ordersв списке. Чужой заказ по вашему ключу не откроется — придёт404.Значение подставляется прямо в строку запроса выше.
- stringв путиобязательный
UUID фрагмента заказа (чанка) — 36 символов, не число и не порядковый номер.
Берётся из поля
idэлемента:GET /orders/{order}/itemsотдаёт список, тот же набор лежит вitems[]детального ответа заказа. Порядковый номер фрагмента — это соседнее полеchunk_index, в путь оно НЕ подставляется.Значение подставляется прямо в строку запроса выше.
Тело запроса
Переделка уже завершённого фрагмента новым текстом. Операция платная — токены списываются как за новую генерацию.
text обязателен. Предел длины — ёмкость фрагмента (max_billable_length из
GET …/items/{item}/text); длиннее — 422 с reason: text_over_capacity. Стоимость
считается по всей новой длине. Бесплатны только наши паузы {{pause=2s}}: <break/>
и любые указания диктору в квадратных скобках ([шёпот], но и [1], [sic]) —
синтаксис провайдера, они тарифицируются и занимают место во фрагменте.
{
"text": "Новая редакция фрагмента."
}Поля
Новый текст готового чанка — обязателен. Переделка уже выполненного фрагмента
тарифицируется как новая генерация (проверка токен-квоты ключа → 429 при
превышении).
Возможные ответы
201Чанк отправлен на переделку. Операция платная: списывается новая токен-квота.
Чанк отправлен на переделку. Операция платная: списывается новая токен-квота.
{
"success": true,
"message": "Order item regeneration created successfully.",
"data": {
"id": "b0c1d2e3-4f5a-4b6c-8d7e-8f9a0b1c2d3e",
"order_id": "9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c",
"item_type": "regeneration",
"chunk_index": 0,
"parent_item_id": "d4e5f6a7-8b9c-4d0e-8f1a-2b3c4d5e6f7a",
"original_text_length": 210,
"current_text_length": 210,
"price_units": 210,
"consumed_units": 0,
"remaining_locked": 210,
"status": "pending",
"result_file": null,
"attempt_number": 1,
"can_retry": false,
"can_regenerate": false,
"created_at": "2026-07-17T14:10:00+00:00",
"updated_at": "2026-07-17T14:10:00+00:00"
}
}Признак успеха. Решение принимайте по HTTP-коду: у любого ответа 2xx здесь true, а ошибка приходит телом другой формы, где этого поля может не быть вовсе.
Пояснение для человека, на языке аккаунта. Показать пользователю можно; разбирать программно — нет: формулировки меняются без предупреждения и кодом ошибки не являются.
dataобязательноеНовая запись перегенерации со своим id. Операция платная: токены списываются заново, прежняя версия фрагмента остаётся в истории.
OrderItemOrderItem
Новая запись перегенерации со своим id. Операция платная: токены списываются заново, прежняя версия фрагмента остаётся в истории.
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.
400Прочий отказ без машинного кода (редко): причина — только в message. Отказы с reason приходят кодами 402/422/503.
Прочий отказ без машинного кода (редко): причина — только в message. Отказы с reason приходят кодами 402/422/503.
{
"success": false,
"message": "The operation could not be completed."
}Всегда 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/insufficient_allowance).
Не хватает средств на перегенерацию (reason: insufficient_balance/insufficient_allowance).
{
"success": false,
"message": "Insufficient balance.",
"reason": "insufficient_balance",
"error_code": "insufficient_balance"
}Всегда false у ошибок.
Причина отказа словами, на языке аккаунта. Для показа пользователю; ветвиться по ней нельзя — формулировки меняются.
Машиночитаемая причина бизнес-отказа (например, input_expired, insufficient_balance). Ветвите обработку по ней, а не по тексту message.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают.
403Нет доступа к заказу, у ключа нет права orders.write, либо нет подписки на сервис (reason: no_subscription)
Нет доступа к заказу, у ключа нет права orders.write, либо нет подписки на сервис (reason: no_subscription)
{
"success": false,
"message": "This API key does not have permission to perform this action."
}Error overview.
404Заказ или элемент не найден
Заказ или элемент не найден
{
"success": false,
"message": "Resource not found."
}Error overview.
422Не передан обязательный text либо переделка невозможна (reason): invalid_status — чанк не completed, text_over_capacity, text_not_voiceable, content_blocked, generative_not_supported (sfx/music), retry_config_outdated — настройки заказа не проходят текущую схему сервиса, создайте новый заказ.
Не передан обязательный text либо переделка невозможна (reason): invalid_status — чанк не completed, text_over_capacity, text_not_voiceable, content_blocked, generative_not_supported (sfx/music), retry_config_outdated — настройки заказа не проходят текущую схему сервиса, создайте новый заказ.
{
"success": true,
"message": "string",
"errors": null
}Всегда false у ошибок.
Причина отказа словами, на языке аккаунта. Для показа пользователю; ветвиться по ней нельзя — формулировки меняются.
Разбор по полям — только у ошибок валидации (422): ключ соответствует полю запроса, значение — список претензий к нему. У остальных кодов приходит null: разбирать нечего, причина целиком в message.
429Превышена токен-квота ключа
Превышена токен-квота ключа
{
"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).
503Приём работы на сервис временно приостановлен (reason: service_maintenance). Повторите позже.
Приём работы на сервис временно приостановлен (reason: service_maintenance). Повторите позже.
{
"success": false,
"message": "The service is temporarily unavailable due to maintenance. Please try again later.",
"reason": "service_maintenance",
"error_code": "service_maintenance"
}Всегда false у ошибок.
Причина отказа словами, на языке аккаунта. Для показа пользователю; ветвиться по ней нельзя — формулировки меняются.
Машиночитаемая причина бизнес-отказа (например, input_expired, insufficient_balance). Ветвите обработку по ней, а не по тексту message.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают.
События, которые это порождает
Ход выполнения приезжает по WebSocket: опрашивать заказ в цикле не обязательно. Подписка требует того же права, что и чтение заказов.
Рядом
Об этом словами
Объекты
Соседние операции
Скормить страницу ИИ
спека 0.0.1