МиксМедиа API
RUEN
ВойтиНачать
Открыть как Markdown
← Попробовать на сайте

Wan 3.0

Alibaba · ~3 мин
от $0.054за секунду

Видеомодель Alibaba до 30 секунд: по описанию, кадрам и образцам (фото, видео, звук), со звуковой дорожкой.

Wan 3.0 — видеомодель Alibaba. Ролики от 2 до 30 секунд в 480p, 720p и 1080p: по описанию, по первому и последнему кадру или по образцам (до 10 фото, 5 видео и 5 звуковых дорожек). Можно выключить звук в ролике — цена та же.

Длину можно выбрать «Авто» — модель решит сама: списывается максимум, лишнее возвращается после готовности. С вашим видео сумма секунд исходника и результата — не больше 30.

Одна модель wan-3.0 · ~3 мин. Что получится, задаётся полями input (описание, кадры, образцы, video_mode, длительность) — отдельных эндпоинтов «оживить / изменить» нет.

Возможности

  • prompt — до 30000 символов
  • duration: "auto" / -1 — длину выбирает модель (на сайте: auto (-1))
  • watermark — метка «AI generated»
  • generate_audio — звук в ролике
  • nsfw_check — проверка до списания

Цена

РазрешениеЦена за секундуС вашим видео, за секунду
480p$0.054$0.054
720p$0.108$0.108
1080p$0.215$0.215
  • Цена = цена секунды × длина ролика, округляется вверх до $0.001. Списывается при создании задачи и полностью возвращается, если задача не удалась.
  • С вашим видео считаются секунды исходного ролика плюс секунды результата.
  • На сайте — галочка auto (-1) рядом с длительностью (не пункт в списке). В API: duration: "auto" или -1 — длину выберет модель, до 30 сек. При создании списывается цена за 30 сек (плюс секунды вашего видео, если оно есть). Когда видео готово, цена пересчитывается по реальной длине, разница сразу возвращается на баланс (в истории — «Возврат за неиспользованные секунды видео»). Итоговая цена — costUsd в recordInfo, длина — duration в resultJson. При video_mode: "edit" длина результата — как у вашего ролика.

Лимиты медиа

ТипОграничения
Фотодо 10; JPG / PNG / WebP; загрузка через files/upload — до 30 МБ на файл
Видеодо 5; вместе ≤ 15 с (каждый клип 2…15 с); MP4 / MOV → на сервере в MP4; загрузка ≤ 200 МБ
Аудиодо 5; вместе ≤ 15 с; MP3 / WAV; загрузка ≤ 200 МБ; можно только звук без фото/видео

Фото — публичные https или upload; видео и звук — только через files/upload.

Параметры (поле input)

ПараметрОписаниеЗначения (по умолчанию — жирным)
promptЧто происходит в ролике: сцена, движение, камера, свет, стильтекст, до 20000 символов
first_frame_urlПервый кадр: ссылка на фото (https), с него начнётся видео"https://…"
last_frame_urlПоследний кадр (по желанию, только вместе с первым)"https://…"
image_urlsФото-образцы (https)["https://…"], до 10
video_urlsВаши видео (MP4): сначала загрузите их через files/upload и передайте полученные ссылки["https://…"], до 5
audio_urlsЗвук (MP3): сначала загрузите через files/upload["https://…"], до 5
resolutionРазрешение видео480p (стандартное) · 720p (высокое (HD)) · 1080p (Full HD)
aspect_ratioСоотношение сторонadaptive (под загруженное) · 16:9 (горизонтальное) · 9:16 (вертикальное) · 1:1 (квадратное) · 4:3 (традиционное) · 3:4 (вертикальное традиционное)
durationДлительность видео в секундахот 2 до 30 сек, либо auto / -1 (длину выберет модель) (по умолчанию 5)
generate_audioВидео со звукомtrue false (по умолчанию true)
watermarkВодяной знак «AI generated» на видеоtrue false (по умолчанию false)
nsfw_checkПроверка содержимого: сначала проверить описание и фото на запрещённое; если нельзя — задача не создаётся и ничего не списываетсяtrue false (по умолчанию false)
seedНомер варианта: то же число с тем же описанием даёт похожий результат; пусто или -1 — случайный-1…4294967295
trim_video_toОбрезать каждое ваше видео до N секунд: остаётся начало ролика. Видео короче — без измененийцелое число от 2 до 15
trim_to_durationОбрезать каждое ваше видео до выбранной длины duration: остаётся начало ролика. При duration: "auto" или video_mode: "edit" — до лимита моделиtrue false (по умолчанию false)
auto_trimЕсли видео вместе длиннее 15 сек — обрезать их самим, а не выдавать ошибку (сначала самое длинное)true false (по умолчанию false)

Примеры

Только описание

curl -X POST https://mixmedia.tech/api/v1/jobs/createTask \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"wan-3.0","input":{"prompt":"Дрон пролетает над осенним лесом на рассвете, туман, кинематографично","resolution":"720p","aspect_ratio":"adaptive","duration":"5"}}'
import os, requests

r = requests.post(
    "https://mixmedia.tech/api/v1/jobs/createTask",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
      "model": "wan-3.0",
      "input": {
        "prompt": "Дрон пролетает над осенним лесом на рассвете, туман, кинематографично",
        "resolution": "720p",
        "aspect_ratio": "adaptive",
        "duration": "5"
      }
    },
)
print(r.json())  # {"code": 200, "data": {"taskId": "..."}}
const r = await fetch("https://mixmedia.tech/api/v1/jobs/createTask", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "model": "wan-3.0",
    "input": {
      "prompt": "Дрон пролетает над осенним лесом на рассвете, туман, кинематографично",
      "resolution": "720p",
      "aspect_ratio": "adaptive",
      "duration": "5"
    }
  }),
});
console.log(await r.json()); // { code: 200, data: { taskId: "..." } }

С первым кадром

curl -X POST https://mixmedia.tech/api/v1/jobs/createTask \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"wan-3.0","input":{"prompt":"Герой медленно поворачивается к камере, ветер развевает волосы","first_frame_url":"https://mixmedia.tech/static/img/previews/gpt-t2i.jpg","resolution":"720p","duration":"5"}}'
import os, requests

r = requests.post(
    "https://mixmedia.tech/api/v1/jobs/createTask",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
      "model": "wan-3.0",
      "input": {
        "prompt": "Герой медленно поворачивается к камере, ветер развевает волосы",
        "first_frame_url": "https://mixmedia.tech/static/img/previews/gpt-t2i.jpg",
        "resolution": "720p",
        "duration": "5"
      }
    },
)
print(r.json())  # {"code": 200, "data": {"taskId": "..."}}
const r = await fetch("https://mixmedia.tech/api/v1/jobs/createTask", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "model": "wan-3.0",
    "input": {
      "prompt": "Герой медленно поворачивается к камере, ветер развевает волосы",
      "first_frame_url": "https://mixmedia.tech/static/img/previews/gpt-t2i.jpg",
      "resolution": "720p",
      "duration": "5"
    }
  }),
});
console.log(await r.json()); // { code: 200, data: { taskId: "..." } }

С образцами

curl -X POST https://mixmedia.tech/api/v1/jobs/createTask \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"wan-3.0","input":{"prompt":"Дрон пролетает над осенним лесом на рассвете, туман, кинематографично","image_urls":["https://mixmedia.tech/static/img/previews/gpt-t2i.jpg"],"resolution":"720p","aspect_ratio":"adaptive","duration":"5"}}'
import os, requests

r = requests.post(
    "https://mixmedia.tech/api/v1/jobs/createTask",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
      "model": "wan-3.0",
      "input": {
        "prompt": "Дрон пролетает над осенним лесом на рассвете, туман, кинематографично",
        "image_urls": [
          "https://mixmedia.tech/static/img/previews/gpt-t2i.jpg"
        ],
        "resolution": "720p",
        "aspect_ratio": "adaptive",
        "duration": "5"
      }
    },
)
print(r.json())  # {"code": 200, "data": {"taskId": "..."}}
const r = await fetch("https://mixmedia.tech/api/v1/jobs/createTask", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "model": "wan-3.0",
    "input": {
      "prompt": "Дрон пролетает над осенним лесом на рассвете, туман, кинематографично",
      "image_urls": [
        "https://mixmedia.tech/static/img/previews/gpt-t2i.jpg"
      ],
      "resolution": "720p",
      "aspect_ratio": "adaptive",
      "duration": "5"
    }
  }),
});
console.log(await r.json()); // { code: 200, data: { taskId: "..." } }

С вашим видео

curl -X POST https://mixmedia.tech/api/v1/jobs/createTask \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"wan-3.0","input":{"prompt":"Сделай ролик в стиле аниме, остальное не меняй","video_urls":["https://mixmedia.tech/files/<id>.mp4"],"resolution":"720p","duration":"5"}}'
import os, requests

r = requests.post(
    "https://mixmedia.tech/api/v1/jobs/createTask",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
      "model": "wan-3.0",
      "input": {
        "prompt": "Сделай ролик в стиле аниме, остальное не меняй",
        "video_urls": [
          "https://mixmedia.tech/files/<id>.mp4"
        ],
        "resolution": "720p",
        "duration": "5"
      }
    },
)
print(r.json())  # {"code": 200, "data": {"taskId": "..."}}
const r = await fetch("https://mixmedia.tech/api/v1/jobs/createTask", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "model": "wan-3.0",
    "input": {
      "prompt": "Сделай ролик в стиле аниме, остальное не меняй",
      "video_urls": [
        "https://mixmedia.tech/files/<id>.mp4"
      ],
      "resolution": "720p",
      "duration": "5"
    }
  }),
});
console.log(await r.json()); // { code: 200, data: { taskId: "..." } }

Обрезать своё видео

Ваши видео вместе — до 15 сек. Слишком длинный ролик не нужно резать заранее:

  • trim_to_duration: true — обрезать каждое видео до выбранной длины duration;
  • trim_video_to: N — оставить N секунд от начала;
  • auto_trim: true — если видео вместе длиннее лимита, обрезать их ровно до лимита, а не выдавать ошибку.

Обрезка бесплатная, а цена считается уже по обрезанным секундам — меньше секунд, дешевле.

curl -X POST https://mixmedia.tech/api/v1/jobs/createTask \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"wan-3.0","input":{"prompt":"Сделай ролик в стиле аниме, остальное не меняй","video_urls":["https://mixmedia.tech/files/<id>.mp4"],"resolution":"720p","duration":"5","trim_to_duration":true,"auto_trim":true}}'
import os, requests

r = requests.post(
    "https://mixmedia.tech/api/v1/jobs/createTask",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
      "model": "wan-3.0",
      "input": {
        "prompt": "Сделай ролик в стиле аниме, остальное не меняй",
        "video_urls": [
          "https://mixmedia.tech/files/<id>.mp4"
        ],
        "resolution": "720p",
        "duration": "5",
        "trim_to_duration": True,
        "auto_trim": True
      }
    },
)
print(r.json())  # {"code": 200, "data": {"taskId": "..."}}
const r = await fetch("https://mixmedia.tech/api/v1/jobs/createTask", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "model": "wan-3.0",
    "input": {
      "prompt": "Сделай ролик в стиле аниме, остальное не меняй",
      "video_urls": [
        "https://mixmedia.tech/files/<id>.mp4"
      ],
      "resolution": "720p",
      "duration": "5",
      "trim_to_duration": true,
      "auto_trim": true
    }
  }),
});
console.log(await r.json()); // { code: 200, data: { taskId: "..." } }

Один файл при загрузке — до 30 сек. Без этих параметров слишком длинные видео дают ошибку 400 с подсказкой.

Создание и результат

  1. POST /api/v1/jobs/createTask с model и input.
  2. Поллите GET /api/v1/jobs/recordInfo?taskId=… каждые 3–5 с (или callback).

Успешный createTask (HTTP 200)

{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_...",
    "task_id": "task_...",
    "status": "submitted"
  }
}

Готовая задача (recordInfo)

{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_...",
    "task_id": "task_...",
    "state": "success",
    "status": "completed",
    "costUsd": "0.384",
    "refunded": false,
    "resultJson": {
      "videos": [
        {
          "url": "https://…/out.mp4"
        }
      ],
      "duration": 8
    }
  }
}

Алиасы: task_id = taskId; status: pending / processing / completed / failed рядом с state. Ссылка на ролик — в resultJson. size — синоним aspect_ratio в input.

Фото можно передать любыми публичными https-ссылками или загрузить через files/upload. Видео и звук — только через files/upload.

Обработка ошибок

Ответ API — JSON {"code", "msg", "data"}; при ошибке есть строковое поле error (тип). На /api/v1/* HTTP-статус совпадает с code в теле.

Примеры тел ответа

400

{
  "code": 400,
  "msg": "input.duration: must be between 4 and 30, or \"auto\" / -1",
  "data": null,
  "error": "invalid_request_error"
}

401

{
  "code": 401,
  "msg": "Authentication failed. Please check your API key",
  "data": null,
  "error": "authentication_error"
}

402

{
  "code": 402,
  "msg": "Insufficient balance. Please top up and try again. Available: $0.01, required: $0.015. Top up at https://ai.aimixmedia.site/cabinet/billing",
  "data": {
    "balance": "0.0100",
    "required": "0.0150",
    "currency": "USD",
    "topUpUrl": "https://mixmedia.tech/cabinet/billing"
  },
  "error": "payment_required"
}

429

{
  "code": 429,
  "msg": "Rate limit exceeded: 10 createTask/upload requests per 10 s per key. Retry after 8s",
  "data": null,
  "error": "rate_limit_error"
}

500

{
  "code": 500,
  "msg": "Internal server error",
  "data": null,
  "error": "server_error"
}

Коды при createTask / upload

codeerrorЧто значитЧто делать
400invalid_request_errorНеверный параметр или телоСмотрите msg
400unsupported_modelНет такой моделиСписок моделей
400nsfw_content_detectedОтклонено проверкой содержимого (nsfw_check)Измените описание или файлы
401authentication_errorНет ключа или он неверныйПроверьте ключ
402payment_requiredНе хватает денегПополните баланс
403permission_errorНет доступаНапишите в поддержку
429rate_limit_errorСлишком много запросовПодождите Retry-After
505model_disabledМодель временно отключенаВыберите другую
500server_errorСбой у насПовторите позже

Примеры msg: Authentication failed. Please check your API key (401); Insufficient balance. Please top up and try again… (402).

Ошибки задачи (recordInfo)

Если задача уже создана и завершилась неудачей: state: "fail" (алиас status: "failed"), failCode / failMsg, объект error: { code, message, type }. Деньги возвращаются (refunded: true).

failCodeerror.typeЧто значит
400nsfw_content_detected / invalid_request_errorМодерация / правила безопасности
422invalid_request_errorМодель не приняла параметры (длина, режим, разрешение, файл)
501server_errorМодель не смогла сгенерировать (failMsg)
504timeout_errorСлишком долго — повторите
500 / 503server_errorСервис временно недоступен

Типичные отказы для этой модели

  • duration вне диапазона, или auto / -1 если авто-длина не поддерживается (только Seedance 2.5)
  • resolution / aspect_ratio (size) / video_mode не из списка выше
  • video_mode = edit или extend без video_urls; для edit — ролик короче 4 с
  • Слишком длинные образцы видео/звука без auto_trim / trim_* → 400
  • nsfw_check: true — при отказе сразу HTTP 400 (nsfw_content_detected), задача не создаётся и деньги не списываются

Лимиты запросов

ЧтоЛимит
createTask и upload20 за 10 с на ключ
recordInfo / list / balance100 за 10 с на ключ

Сверх лимита — HTTP 429 и Retry-After.

© 2026 МиксМедиа