seedintegerНеобязательноОт 0 до 2147483647. Фиксируйте его, пока подбираете разрешение или длительность, иначе каждый перезапуск меняет сразу две вещи.
- По умолчанию
- Не задано
- Ограничения
- minimum:0maximum:2147483647
Wan 3.0 Pro reference-to-video держит лицо, одежду, декорации, движение или голос по референсам из изображений, видео и аудио плюс необязательный документ или веб-ссылка. Рендерит 2–30 секунд в 1080p, 2K или 4K.
Примеры используют публичные параметры выбранного эндпоинта. Замените API-ключ и примеры медиафайлов, затем отправьте запрос со своего сервера.
SDK и интеграцииhttps://api.spicyapi.ai/api/v1/jobs/createTaskХраните 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-pro/reference-to-video",
"input": {
"aspect_ratio": "adaptive",
"duration_seconds": 5,
"reference_image_urls": [
"https://example.com/reference.png"
],
"resolution": "1080p"
}
}'
# 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. Фиксируйте его, пока подбираете разрешение или длительность, иначе каждый перезапуск меняет сразу две вещи.
enable_prompt_expansionbooleanНеобязательноУ этого семейства включено по умолчанию. Тощие брифы оно дополняет, подробные переписывает, поэтому выключайте, как только prompt стал точным описанием кадра. Для файла-референса или веб-ссылки оно должно быть включено: прикладывая reference_file_url или reference_link_url, не задавайте его или ставьте true, потому что документ или страница читаются на этом шаге. Явный false вместе с файлом или ссылкой отклоняется.
generate_audiobooleanНеобязательноВключён по умолчанию. Звук генерируется вместе с картинкой и приходит внутри того же файла. Ставьте false, когда ролик озвучит композитор.
duration_secondsintegerНеобязательноВлияет на ценуЛюбое целое число от 2 до 30, по умолчанию 5, или -1 — умная длительность: резервируется максимум, а списание идёт по фактически выданной длине. С референсными видео их общая длина плюс результат должны укладываться в 30 секунд, и тарифицируется и то и другое. Найдите кадр на 5 секундах в 1080p, прежде чем платить за длинный рендер в 4K.
-123456789101112131415161718192021222324252627282930aspect_ratiostringНеобязательно16:9, 4:3, 1:1, 3:4, 9:16 или adaptive. По умолчанию adaptive, то есть выбирает модель; называйте формат, когда он у сдачи фиксирован.
"16:9""4:3""1:1""3:4""9:16""adaptive"resolutionstringНеобязательноВлияет на цену1080p, 2k или 4k, по умолчанию 1080p. Нативно Wan 3.0 рендерит максимум в 1080p, поэтому ступени выше — 2k и 4k — выдаются увеличением этого рендера, а не нативным рендерингом в таком размере: лишние пиксели берутся из увеличения и не бывают лучше рендера под ними. Ступеней 480p и 720p здесь нет; для этих размеров берите Wan 3.0.
"1080p""2k""4k"reference_link_urlstringОбязательно при условииОдна публичная веб-страница, которую модель читает как референс, например статья, страница товара или профиль персонажа. Она должна открываться без входа в аккаунт. Некоторые сайты блокируют автоматическое чтение, а страницу со слишком коротким текстом использовать нельзя; в обоих случаях задача завершается ошибкой о том, что URL не удалось прочитать, а неудавшиеся задачи не тарифицируются. Нельзя вместе с reference_file_url; если enable_prompt_expansion не задан, приложенная ссылка тоже включает расширение промпта. Ссылки не тарифицируются.
reference_file_urlstringОбязательно при условииОдин документ, который модель читает, прежде чем ставить кадр: лист персонажа, сценарий, список планов или бриф продукта. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES или NUMBERS, до 100 МБ и 50 страниц. Работает сам по себе или вместе с референсными изображениями, видео и аудио, но не вместе с reference_link_url. Если enable_prompt_expansion не задан, приложенный файл включает расширение промпта для этого запроса, потому что документ читается именно на этом шаге. Файлы не тарифицируются.
reference_audio_urlsarray<string>Обязательно при условииДо 5 клипов, каждый от 1 до 15 секунд, в сумме не больше 15 секунд: голос, начитка реплики или фон помещения, под который должен лечь план. Референсное аудио не тарифицируется. WAV или MP3, до 15 МБ на клип. Как и для видео, эти ограничения проверяются во время генерации, а не при приёме задачи.
reference_video_urlsarray<string>Обязательно при условииВлияет на ценуДо 5 клипов, каждый от 1 до 15 секунд, в сумме не больше 15 секунд. Используйте их для движения и манеры камеры, а не для лица. Их длина тарифицируется вместе с результатом, и референсное видео плюс результат должны укладываться в 30 секунд. MP4 или MOV, не менее 16 кадров в секунду, от 240 до 4096 px по каждой стороне, соотношение сторон не шире 8:1, до 100 МБ на клип. Эти ограничения проверяются во время генерации, а не при приёме задачи, поэтому сверяйте длину клипов до отправки.
reference_image_urlsarray<string>Обязательно при условииОт 1 до 10 изображений — референсы внешности, гардероба и площадки. Назовите каждое в описании — персонаж, одежда, площадка, — иначе они усредняются. Референсные изображения не тарифицируются. JPEG, PNG без прозрачности, BMP или WEBP; от 240 до 8000 px по каждой стороне, соотношение сторон не шире 8:1, до 20 МБ на файл.
promptstringНеобязательноНеобязателен, но именно здесь вы говорите, зачем нужен каждый референс — какая картинка персонаж, какой клип задаёт движение, какое аудио голос — и что в кадре происходит.
{
"additionalProperties": false,
"anyOf": [
{
"required": [
"reference_image_urls"
]
},
{
"required": [
"reference_video_urls"
]
},
{
"required": [
"reference_audio_urls"
]
},
{
"required": [
"reference_file_url"
]
},
{
"required": [
"reference_link_url"
]
}
],
"properties": {
"aspect_ratio": {
"default": "adaptive",
"description": "Output aspect ratio; adaptive follows the input media and the intent.",
"enum": [
"16:9",
"4:3",
"1:1",
"3:4",
"9:16",
"adaptive"
],
"type": "string",
"x-ui": {
"order": 60,
"widget": "select"
}
},
"duration_seconds": {
"default": 5,
"description": "Output duration in seconds. Pass -1 for smart duration: the model picks the length from the prompt and any input media instead of a fixed number. With reference videos, their total length plus the output length must not exceed 30 seconds, and the reference video seconds are billed together with the output seconds.",
"enum": [
-1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30
],
"type": "integer",
"x-ui": {
"affects_price": true,
"enum_labels": {
"-1": "Smart"
},
"order": 50,
"widget": "slider"
}
},
"enable_prompt_expansion": {
"default": true,
"description": "Expand the prompt before generation.",
"type": "boolean",
"x-ui": {
"order": 30,
"widget": "switch"
}
},
"generate_audio": {
"default": true,
"description": "Include an audio track in the output.",
"type": "boolean",
"x-ui": {
"order": 40,
"widget": "switch"
}
},
"prompt": {
"description": "Describe the subject, motion and camera.",
"maxLength": 20000,
"minLength": 1,
"type": "string",
"x-ui": {
"order": 100,
"reference_tokens": {
"reference_audio_urls": "Audio {index}",
"reference_image_urls": "Image {index}",
"reference_video_urls": "Video {index}"
},
"widget": "textarea"
}
},
"reference_audio_urls": {
"description": "Reference audio, up to 5 clips of 1 to 15 seconds each and 15 seconds in total.",
"items": {
"contentMediaType": [
"audio/mpeg",
"audio/wav"
],
"format": "uri",
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"max_total_duration_seconds": 15,
"order": 86,
"widget": "multi-upload"
}
},
"reference_file_url": {
"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"
],
"description": "One reference document (PDF, DOCX, TXT, MD and similar) that the model reads for characters, wardrobe, setting and action.",
"format": "uri",
"type": "string",
"x-ui": {
"order": 76,
"widget": "upload"
}
},
"reference_image_urls": {
"description": "Ordered reference images used to guide the scene.",
"items": {
"contentMediaType": [
"image/jpeg",
"image/png",
"image/webp",
"image/gif"
],
"format": "uri",
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array",
"x-ui": {
"order": 90,
"primary": true,
"widget": "multi-upload"
}
},
"reference_link_url": {
"description": "One public web page the model reads for reference. It must open without a login.",
"format": "uri",
"type": "string",
"x-ui": {
"order": 74,
"placeholder": "https://",
"widget": "text"
}
},
"reference_video_urls": {
"description": "Reference videos, up to 5 clips of 1 to 15 seconds each and 15 seconds in total.",
"items": {
"contentMediaType": [
"video/mp4",
"video/webm",
"video/quicktime"
],
"format": "uri",
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"affects_price": true,
"max_total_duration_seconds": 15,
"order": 88,
"widget": "multi-upload"
}
},
"resolution": {
"default": "1080p",
"description": "Output resolution tier. A native Wan 3.0 render tops out at 1080p, so the 2k and 4k tiers are delivered by enlarging that render instead of rendering natively at those sizes.",
"enum": [
"1080p",
"2k",
"4k"
],
"type": "string",
"x-ui": {
"affects_price": true,
"order": 70,
"widget": "radio"
}
},
"seed": {
"description": "Random seed. Omit for a generated seed.",
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"x-ui": {
"order": 10,
"widget": "number"
}
}
},
"type": "object",
"x-pricing": {
"billingMode": "duration_capped",
"variantFields": [
"resolution"
]
}
}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-pro/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 отсутствует. Не передавайте подписанные ссылки посторонним.
Используйте SpicyAPI в приложении, терминале, ИИ-ассистенте или визуальном процессе. Выберите руководство по настройке.
Писать код выше вовсе не обязательно. Подключите сервер MCP один раз — и любой агент, который говорит на MCP (Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat), вызовет эту модель по имени. Либо запустите её из терминала одной командой.
Возьми alibaba/wan-3.0-pro/reference-to-video и сделай пятисекундный кадр: крыша в неоне на закате, медленный наезд. Сохрани в ./out/.
Агент найдёт модель в каталоге, сам загрузит локальный файл, покажет точную смету и предельную сумму списания — и дождётся вашего согласия. До этого ничего не списывается.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillПервая строка даёт агенту инструменты, вторая — Skill, то есть правила обращения с ними: сначала смета, потом списание; локальные файлы загружать, а не вставлять байтами; URL готового результата читать, а не угадывать. Остальные клиенты подключают тот же сервер через собственный файл настроек — см. раздел для разработчиков.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0-pro/reference-to-video \
--input-json '{"aspect_ratio":"adaptive","duration_seconds":5,"reference_image_urls":["https://example.com/reference.png"],"resolution":"1080p"}' \
--waitВходные данные взяты из схемы этого эндпоинта — той же, что и в примерах выше. --wait дождётся завершения задачи и выведет её, а --yes пропустит подтверждение в CI. Сначала задайте SPICY_API_KEY: один ключ работает и для API, и для CLI, и для сервера MCP.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0-pro/reference-to-video \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that appliedКлюч --retention только сокращает срок — 30m, 1h, 7d или 0, чтобы удалить сразу после перехода задачи в конечное состояние. Реально действует наименьшее из трёх: ваш запрос, настройки аккаунта и предел платформы, — поэтому считайте его из записи задачи, а не исходите из того, что запрошенное число применилось. Запросить срок больше разрешённого аккаунтом нельзя: это ничего не изменит.
Установите узлы SpicyAPI через ComfyUI Manager или командой ниже и найдите на холсте Wan 3.0 Pro · Reference To Video. У узла те же параметры, что и на этой странице, а цена показывается до запуска.
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapiВстроенная панель читает ту же схему, что и эта страница, поэтому не может разойтись с API. Если содержимое должно индексироваться поиском по документации, возьмите JSON из /api/embed/models/ и отрисуйте его самостоятельно.
<iframe src="https://spicyapi.ai/embed/ru/models/wan-3-0-pro/api?model=alibaba%2Fwan-3.0-pro%2Freference-to-video" width="100%" height="560" loading="lazy" title="Пример запроса" style="border:1px solid rgba(0,0,0,.12)"></iframe>