Перейти к основному контенту

Wan 3.0 reference-to-video от Alibaba сохраняет личность, одежду, локацию или голос по референсам: до 10 изображений, 5 видео и 5 аудиофайлов. Выдаёт 2–30 секунд в 480p–1080p, промпт необязателен.

От $0.045/сНа 10% ниже официальной цены

Рабочая область

Отправить запрос

Быстрый старт

Примеры используют публичные параметры выбранного эндпоинта. Замените API-ключ и примеры медиафайлов, затем отправьте запрос со своего сервера.

SDK и интеграции
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Аутентификация API

Храните API-ключ в серверной переменной окружения SPICY_API_KEY. Используйте Bearer-аутентификацию и Content-Type: application/json для JSON-запросов.

Authorization: Bearer $SPICY_API_KEY
Пример результатаИспользовать пример
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "alibaba/wan-3.0/reference-to-video",
  "input": {
    "aspect_ratio": "16:9",
    "duration_seconds": 5,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ],
    "resolution": "720p"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Пример построен по входной схеме этой модели — той же, по которой API проверяет каждый запрос.

Входные параметры

Поместите эти поля в объект input тела запроса. Имена и типы соответствуют API. Не предполагайте значение по умолчанию, если оно не задано.

Некоторые поля зависят от других входных данных. Полные правила для условно обязательных полей приведены в JSON Schema ниже.

seedintegerНеобязательно

От 0 до 2147483647. Держите его неизменным, чтобы сравнивать по одному изменённому полю; уберите — получите разнообразие.

По умолчанию
Не задано
Ограничения
minimum:0
maximum:2147483647
enable_prompt_expansionbooleanНеобязательно

По умолчанию выключено. Во включённом виде описание переписывается перед генерацией: тонкому брифу это помогает, подробному — мешает. Если не задавать его и приложить reference_file_url или reference_link_url, оно включается для этого запроса, потому что документ или страница читаются на этом шаге. Если явно указать false, файл или страница всё равно будут прочитаны, но без переписывания промпта.

По умолчанию
Не задано
generate_audiobooleanНеобязательно

По умолчанию включён. Клип возвращается со звуком, уже сцепленным с картинкой. Ставьте false, если озвучиваете кадр сами.

По умолчанию
true
duration_secondsintegerНеобязательноВлияет на цену

Любое целое от 2 до 30 или -1 для автодлительности, по умолчанию 5. С референсными видео их общая длительность плюс это значение должны укладываться в 30 секунд, а их секунды оплачиваются сверх результата. Доведите вид на 5 секундах и только потом удлиняйте.

По умолчанию
5
Допустимые значения
-123456789101112131415161718192021222324252627282930
resolutionstringНеобязательноВлияет на цену

480p, 720p или 1080p, по умолчанию 720p. Разрешение меняет и цену, и время возврата задачи.

По умолчанию
"720p"
Допустимые значения
"480p""720p""1080p"
enable_thinkingbooleanНеобязательно

Заставляет модель продумать задание и референсы до генерации. Помогает с объёмными документами, веб-страницами и сложными референсными изображениями, но генерация идёт дольше. По умолчанию выключен; включается сам, если передан референсный файл или ссылка. На цену не влияет.

По умолчанию
false
aspect_ratiostringНеобязательно

16:9, 9:16, 1:1, 4:3, 3:4 или adaptive, при котором выбирает модель. По умолчанию 16:9.

По умолчанию
"16:9"
Допустимые значения
"16:9""9:16""1:1""4:3""3:4""adaptive"
reference_link_urlstringОбязательно при условии

Одна публичная веб-страница, которую модель читает как референс, например статья, страница товара или профиль персонажа. Она должна открываться без входа в аккаунт. Некоторые сайты блокируют автоматическое чтение, а страницу со слишком коротким текстом использовать нельзя; в обоих случаях задача завершается ошибкой о том, что URL не удалось прочитать, а неудавшиеся задачи не тарифицируются. Нельзя вместе с reference_file_url; если enable_prompt_expansion не задан, приложенная ссылка тоже включает расширение промпта. Ссылки не тарифицируются.

По умолчанию
Не задано
Ограничения
format:"uri"
reference_file_urlstringОбязательно при условии

Один документ, который модель читает, прежде чем ставить кадр: лист персонажа, сценарий, список планов или бриф продукта. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES или NUMBERS, до 100 МБ и 50 страниц. Работает сам по себе или вместе с референсными изображениями, видео и аудио, но не вместе с reference_link_url. Если enable_prompt_expansion не задан, приложенный файл включает расширение промпта для этого запроса, потому что документ читается именно на этом шаге. Файлы не тарифицируются.

По умолчанию
Не задано
Ограничения
format:"uri"
contentMediaType:["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.apple.keynote","application/vnd.apple.pages","application/vnd.apple.numbers","text/plain","text/markdown"]
reference_audio_urlsarray<string>Обязательно при условии

До 5 клипов, каждый от 1 до 15 секунд, в сумме не больше 15 секунд: голос, начитка реплики или фон помещения, под который должен лечь план. Референсное аудио не тарифицируется. WAV или MP3, до 15 МБ на клип. Как и для видео, эти ограничения проверяются во время генерации, а не при приёме задачи.

По умолчанию
Не задано
Ограничения
minItems:1
maxItems:5
reference_video_urlsarray<string>Обязательно при условииВлияет на цену

До 5 клипов, каждый от 1 до 15 секунд, в сумме не больше 15 секунд. Используйте их для движения и манеры камеры, а не для лица. Их длина тарифицируется вместе с результатом, и референсное видео плюс результат должны укладываться в 30 секунд. MP4 или MOV, не менее 16 кадров в секунду, от 240 до 4096 px по каждой стороне, соотношение сторон не шире 8:1, до 100 МБ на клип. Эти ограничения проверяются во время генерации, а не при приёме задачи, поэтому сверяйте длину клипов до отправки.

По умолчанию
Не задано
Ограничения
minItems:1
maxItems:5
reference_image_urlsarray<string>Обязательно при условии

От 1 до 10 изображений — референсы внешности, гардероба и площадки. Назовите каждое в описании — персонаж, одежда, площадка, — иначе они усредняются. Референсные изображения не тарифицируются. JPEG, PNG без прозрачности, BMP или WEBP; от 240 до 8000 px по каждой стороне, соотношение сторон не шире 8:1, до 20 МБ на файл. Проверка лиц в этой модели часто отклоняет фотографии реальных людей, и задача завершается ошибкой «The input content is suspected to include real human faces.». Используйте вместо них иллюстрированных или отрендеренных в 3D персонажей; отклонённые задачи не тарифицируются.

По умолчанию
Не задано
Ограничения
minItems:1
maxItems:10
promptstringНеобязательно

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

По умолчанию
Не задано
Ограничения
minLength:1

Отследить задачу

HTTP 202 означает принятие задачи, а не завершение генерации. Сохраните полученный taskId и проверяйте эту задачу. Не создавайте новую, пока ждёте результат.

Ответ при приёме задачи
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

В ответе о приёме есть оценка стоимости — приложение сможет показать ту же сумму в истории задач и в расчётах.

Получить задачу
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Начните с интервала около 2 секунд и постепенно увеличивайте его. Прекратите опрос при конечном состоянии. После сбоя соединения используйте исходный taskId. Повторно создавать задачу можно только с исходным ключом идемпотентности и исходным телом запроса.

Или пусть вызов придёт сам
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Передайте callBackUrl при создании задачи — готовая запись придёт к вам POST-запросом, и никакого опроса не понадобится. В каждой доставке есть X-Webhook-Timestamp, X-Webhook-Signature и X-Webhook-Payload-Version. Подпись — это HMAC-SHA256 в base64 от taskId.timestamp.sha256(body), поэтому проверять её нужно по исходным байтам: если разобрать JSON и сериализовать заново, байты изменятся и проверка не пройдёт. Неудачные доставки повторяются, так что один и тот же taskId может прийти дважды — сделайте обработчик идемпотентным. Сначала ответьте 2xx, работу выполняйте после: медленный обработчик считается неудачной доставкой.

Прочитать результат

Обрабатывайте output только при state, равном succeeded. При ошибке проверьте errorCode, errorMessage и request_id. Стоимость и состояния в примерах не являются фактическим счётом.

Пример ответа после завершения
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "alibaba/wan-3.0/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp4",
          "mime": "video/mp4",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Доступные файлы можно открыть или скачать по assets[].url без заголовка API Authorization. Подписанная ссылка действует до expiresAt. Чтобы обновить её, повторно запросите задачу в течение срока хранения файла. У ожидающих или недоступных файлов URL отсутствует. Не передавайте подписанные ссылки посторонним.

SDK и интеграции

Используйте SpicyAPI в приложении, терминале, ИИ-ассистенте или визуальном процессе. Выберите руководство по настройке.

Использование в ComfyUI

Установите узлы SpicyAPI через ComfyUI Manager или командой ниже и найдите на холсте Wan 3.0 · Reference to Video. У узла те же параметры, что и на этой странице, а цена показывается до запуска.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi