> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apimart.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Генерация видео Muse Video Ext

> Создание одного MP4 по тексту или максимум 9 референсным изображениям: около 10 секунд, 720p, со звуком.

> [!NOTE]
>
> API работает асинхронно. После отправки сохраните ID задачи и проверяйте состояние и результат через `GET /v1/tasks/{task_id}`. В стандартном ответе на отправку ID находится в `data[0].task_id`.

```bash cURL theme={null}
curl --request POST \
  --url https://api.apimart.ai/v1/videos/generations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: <unique-operation-key>' \
  --data '{
    "model": "muse-video-ext",
    "prompt": "Waves gently wash a beach at sunset, slow camera pan, natural ocean sounds, no text",
    "aspect_ratio": "16:9",
    "duration": 10,
    "resolution": "720p"
  }'
```

```python Python theme={null}
import requests

response = requests.post(
    "https://api.apimart.ai/v1/videos/generations",
    headers={
        "Authorization": "Bearer <token>",
        "Accept": "application/json",
        "Idempotency-Key": "<unique-operation-key>"
    },
    json={
        "model": "muse-video-ext",
        "prompt": "Waves gently wash a beach at sunset, slow camera pan, natural ocean sounds, no text",
        "aspect_ratio": "16:9",
        "duration": 10,
        "resolution": "720p"
    }
)
response.raise_for_status()
print(response.json())
```

```javascript JavaScript theme={null}
const response = await fetch("https://api.apimart.ai/v1/videos/generations", {
  method: "POST",
  headers: {
    Authorization: "Bearer <token>",
    "Content-Type": "application/json",
    Accept: "application/json",
    "Idempotency-Key": "<unique-operation-key>"
  },
  body: JSON.stringify({
    "model": "muse-video-ext",
    "prompt": "Waves gently wash a beach at sunset, slow camera pan, natural ocean sounds, no text",
    "aspect_ratio": "16:9",
    "duration": 10,
    "resolution": "720p"
  })
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
```

```json 200 theme={null}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01K..."
    }
  ]
}
```

## Заголовки запроса

**Authorization** `string` *required*

Передайте APIMart API Key в формате `Bearer <token>`. Отправка и проверка задачи требуют аутентификации от имени одного пользователя.

**Idempotency-Key** `string`

Настоятельно рекомендуется. Для каждой независимой генерации создавайте новый ключ (1–191 видимый ASCII-символ; рекомендуется UUID). Замените `<unique-operation-key>` в примерах. При повторе после тайм-аута или сетевой ошибки сохраняйте тот же endpoint, тело, версию ответа и ключ. После получения ID только проверяйте эту задачу.

## Параметры запроса

**model** `string` *required*

Фиксированное значение: `muse-video-ext`.

**prompt** `string` *required*

Текстовое описание результата на китайском или английском языке. После удаления пробелов по краям текст не должен быть пустым. Обязательно и при наличии референсных изображений.

**image\_urls** `string[]`

До 9 непустых входных изображений. Поддерживаются публичные URL, Data URI (например, `data:image/png;base64,...`) и чистый base64. Пропустите поле или передайте `[]` для генерации только по тексту. Рекомендуются PNG, JPEG и WebP. Сервер должен иметь прямой доступ к URL без cookies браузерной авторизации.

Суммарный исходный размер всех изображений не должен превышать **11 MiB (11 534 336 байт)**. Это общий лимит, а не лимит на изображение. base64 дополнительно увеличивает тело запроса. Не передавайте URL `blob:`, локальные пути и объекты `File`.

**aspect\_ratio** `string`

Поддерживаются семь соотношений ниже. Без параметра генерация по тексту использует `16:9`, а с референсами следует их композиции. Явное соотношение имеет приоритет. Для автоматического выбора пропустите поле; не передавайте `"auto"`.

`1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3`

**size** `string`

Поле совместимости: семь соотношений выше или `auto`. Размеры в пикселях, например `1024x1024`, не поддерживаются. Только `size: "auto"` равнозначно отсутствию соотношения. Рекомендуется `aspect_ratio`. Если оба поля корректны, приоритет у `aspect_ratio`, но они проверяются независимо: корректное соотношение не отменяет ошибку в `size`.

**n** `integer` (default: 1)

Один результат за запрос. Допускается только число `1`. Явные `0`, отрицательные значения и значения больше `1` приводят к ошибке.

**duration** `integer | string` (default: 10)

Фиксированная длительность около 10 секунд. Допустимы число `10` и строки `"10"`, `"10s"`; рекомендуется число `10`. Совместимые псевдонимы: `seconds` и `duration_seconds`. Используйте одно поле длительности; каждое переданное поле проверяется отдельно.

**resolution** `string` (default: 720p)

Поддерживается только `720p`, не `1080p` и не `4k`. Фактические размеры и длительность воспроизведения определяются метаданными возвращённого файла.

**audio** `boolean`

Видео по умолчанию содержит звук; поле можно пропустить. `true` не меняет поведение, `false` отклоняется.

> [!NOTE]
>
> Возвращается URL MP4: около 10 секунд, 720p, со звуком. Референсы направляют генерацию, но попиксельное совпадение с первым кадром не гарантируется.

### Другие необязательные параметры

**webhook** `string`

Базовый URL backend для уведомлений. Платформа удаляет завершающие слеши и добавляет `/callback`: `https://your-backend.example/muse` превращается в `https://your-backend.example/muse/callback`. При использовании только опроса можно пропустить.

**language** `string`

Язык ошибок Webhook, не влияет на генерируемый контент. Допустимы `zh`, `en`, `ja`, `ko`, `ru`, `fr`, `de`, `id`, `pt`, `es`. Региональные теги вроде `zh-CN` не поддерживаются. Язык опроса передавайте отдельно в параметре GET-запроса.

## Генерация с референсными изображениями

```json theme={null}
{
  "model": "muse-video-ext",
  "prompt": "The fox in the reference image slowly raises its head, wind moves its fur, gentle camera push-in",
  "image_urls": [
    "https://your-cdn.example/fox.png"
  ],
  "duration": 10,
  "resolution": "720p"
}
```

Замените URL примера доступным URL изображения. Соотношение пропущено, чтобы следовать композиции референса; для фиксированного соотношения добавьте `aspect_ratio`. Дополнительные изображения добавляйте в `image_urls`, всего не более 9.

## Ответ на отправку

По умолчанию возвращается HTTP `200`, а `data` является массивом. `submitted` означает принятие задачи, а не завершение генерации. Сохраните `data[0].task_id` и затем проверяйте задачу.

> **Необязательная версия ответа: 2026-07-27**
>
> С заголовком `X-APIMart-Response-Version: 2026-07-27` отправка возвращает HTTP `202`. ID задачи читайте из `data.id`, путь опроса — из `data.poll_url`.
>
> ```json theme={null}
> {
>   "code": 202,
>   "request_id": "req_example",
>   "data": {
>     "id": "task_01K...",
>     "object": "generation.task",
>     "type": "video",
>     "status": "pending",
>     "progress": 0,
>     "poll_url": "/v1/tasks/task_01K..."
>   }
> }
> ```
>
> Эта версия не меняет структуру GET-ответа. Добавив заголовок, не продолжайте извлекать ID отправки через `data[0].task_id`.

## Проверка состояния и результатов

Используйте полный ID из ответа на отправку и ту же учётную запись. Необязательный `language` задаёт язык ошибок. Все поля описаны в разделе [Состояние задачи](https://docs.apimart.ai/ru/api-reference/tasks/status.md).

```bash theme={null}
curl --request GET \
  --url 'https://api.apimart.ai/v1/tasks/<task_id>?language=ru' \
  --header 'Authorization: Bearer <token>'
```

Рекомендуемый интервал — 5–10 секунд, не более одного выполняющегося запроса на задачу. Тайм-аут клиента или остановка опроса не отменяют серверную задачу. Сохраните ID и позже возобновите GET-запросы; не запускайте новую генерацию автоматически.

| `data.status` | Действие |
| - | - |
| `pending` / `processing` | В очереди или в обработке; продолжайте опрос. |
| `completed` | Генерация успешна; остановите опрос и прочитайте URL результата. |
| `failed` | Ошибка генерации; остановите опрос и прочитайте `data.error.message`. |
| `unknown` / … | Состояние не определено. Сохраните ID и ограниченно повторяйте запросы; не считайте задачу успешной и не перезапускайте автоматически. |

Завершение определяйте по `data.status`. HTTP `200` или `progress: 100` сами по себе не означают успешную генерацию. `polling_error` во время обработки также не является окончательной ошибкой задачи.

Пример ответа для завершённой задачи (URL результата — заглушка):

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01K...",
    "status": "completed",
    "progress": 100,
    "result": {
      "videos": [
        {
          "url": [
            "https://cdn.example/generated-video.mp4"
          ]
        }
      ]
    }
  }
}
```

В ответе на опрос `data` — объект, а `url` — массив строк. Первый результат находится в `data.result.videos[0].url[0]`. Если присутствует `expires_at`, это срок действия в секундах Unix; сохраните нужные файлы до его истечения. `actual_time` — время обработки задачи, а не длительность видео.

## Ограничения и обработка ошибок

Не поддерживаются референсные видео и аудио, маски, управление первым/последним кадром, продление и remix. `quality` не влияет на генерацию. Пропускайте `seed`, `negative_prompt`, `width`, `height`, `response_format`, `output_format`: они не входят в параметры генерации этой модели. `async: false` не включает синхронную генерацию, а `stream` не предоставляет SSE-поток генерации.

| HTTP / `error.code` | Действие |
| - | - |
| `400 / invalid_request_error` | Проверьте prompt, число референсов, соотношение сторон, число результатов и фиксированные параметры вывода. |
| `409 / idempotency_in_progress` | Выждите время из `Retry-After`, затем повторите исходный запрос с тем же ключом идемпотентности. |
| `409 / idempotency_key_reused` | Один ключ использован для разных запросов. Исправьте управление ключами: каждой независимой генерации нужен новый ключ. |
| `409 / idempotency_result_indeterminate` | Остановите автоматическую повторную отправку и сохраните ключ и сведения о задаче для проверки. |
| `429` | Повторяйте запрос после задержки согласно `Retry-After`. |

Неудачная задача также может вернуть HTTP `200`; проверяйте `data.status` и `data.error.message`. Сетевая ошибка или `5xx` при отправке может возникнуть уже после принятия, поэтому не отправляйте сразу повторно с новым ключом.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.