seedintegerНеобязательноОт 0 до 2147483647. Держите его неизменным, чтобы сравнивать по одному изменённому полю; уберите — получите разнообразие.
- По умолчанию
- Не задано
- Ограничения
- minimum:0maximum:2147483647
Wan 3.0 reference-to-video от Alibaba сохраняет личность, одежду, локацию или голос по референсам: до 10 изображений, 5 видео и 5 аудиофайлов. Выдаёт 2–30 секунд в 480p–1080p, промпт необязателен.
Примеры используют публичные параметры выбранного эндпоинта. Замените 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/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. Держите его неизменным, чтобы сравнивать по одному изменённому полю; уберите — получите разнообразие.
enable_prompt_expansionbooleanНеобязательноПо умолчанию выключено. Во включённом виде описание переписывается перед генерацией: тонкому брифу это помогает, подробному — мешает. Если не задавать его и приложить reference_file_url или reference_link_url, оно включается для этого запроса, потому что документ или страница читаются на этом шаге. Если явно указать false, файл или страница всё равно будут прочитаны, но без переписывания промпта.
generate_audiobooleanНеобязательноПо умолчанию включён. Клип возвращается со звуком, уже сцепленным с картинкой. Ставьте false, если озвучиваете кадр сами.
duration_secondsintegerНеобязательноВлияет на ценуЛюбое целое от 2 до 30 или -1 для автодлительности, по умолчанию 5. С референсными видео их общая длительность плюс это значение должны укладываться в 30 секунд, а их секунды оплачиваются сверх результата. Доведите вид на 5 секундах и только потом удлиняйте.
-123456789101112131415161718192021222324252627282930resolutionstringНеобязательноВлияет на цену480p, 720p или 1080p, по умолчанию 720p. Разрешение меняет и цену, и время возврата задачи.
"480p""720p""1080p"enable_thinkingbooleanНеобязательноЗаставляет модель продумать задание и референсы до генерации. Помогает с объёмными документами, веб-страницами и сложными референсными изображениями, но генерация идёт дольше. По умолчанию выключен; включается сам, если передан референсный файл или ссылка. На цену не влияет.
aspect_ratiostringНеобязательно16:9, 9:16, 1:1, 4:3, 3:4 или adaptive, при котором выбирает модель. По умолчанию 16:9.
"16:9""9:16""1:1""4:3""3:4""adaptive"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 МБ на файл. Проверка лиц в этой модели часто отклоняет фотографии реальных людей, и задача завершается ошибкой «The input content is suspected to include real human faces.». Используйте вместо них иллюстрированных или отрендеренных в 3D персонажей; отклонённые задачи не тарифицируются.
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": "16:9",
"description": "Output aspect ratio; adaptive follows the input media and the intent.",
"enum": [
"16:9",
"9:16",
"1:1",
"4:3",
"3:4",
"adaptive"
],
"type": "string",
"x-ui": {
"order": 70,
"widget": "select"
}
},
"duration_seconds": {
"default": 5,
"description": "Requested output length 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": {
"advanced": false,
"affects_price": true,
"enum_labels": {
"-1": "Smart"
},
"order": 50,
"unit": "s",
"widget": "slider"
}
},
"enable_prompt_expansion": {
"description": "Allow the service to expand the submitted creative brief before generation.",
"type": "boolean",
"x-ui": {
"order": 30,
"widget": "switch"
}
},
"enable_thinking": {
"default": false,
"description": "Let the model reason about the brief and the reference material before generating. Helps with complex references; slower. Switches on by itself when a reference file or link is given.",
"type": "boolean",
"x-ui": {
"order": 66,
"widget": "switch"
}
},
"generate_audio": {
"default": true,
"description": "Request generated audio with the video.",
"type": "boolean",
"x-ui": {
"order": 40,
"widget": "switch"
}
},
"prompt": {
"description": "Describe the subject, action, camera, light, pacing, and boundaries for the shot.",
"minLength": 1,
"type": "string",
"x-ui": {
"order": 110,
"primary": true,
"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 items and 15 seconds in total.",
"items": {
"contentMediaType": [
"audio/mpeg",
"audio/wav"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"max_total_duration_seconds": 15,
"order": 80,
"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": "Reference images, up to 10 items.",
"items": {
"contentMediaType": [
"image/jpeg",
"image/png",
"image/webp",
"image/gif"
],
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array",
"x-ui": {
"order": 100,
"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 items and 15 seconds in total.",
"items": {
"contentMediaType": [
"video/mp4",
"video/webm",
"video/quicktime"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"type": "array",
"x-ui": {
"affects_price": true,
"max_duration_seconds": 15,
"max_total_duration_seconds": 15,
"order": 90,
"widget": "multi-upload"
}
},
"resolution": {
"default": "720p",
"description": "Output resolution.",
"enum": [
"480p",
"720p",
"1080p"
],
"type": "string",
"x-ui": {
"advanced": false,
"affects_price": true,
"order": 60,
"widget": "radio"
}
},
"seed": {
"description": "Random seed. Keep it fixed only for controlled comparisons, not as a frame-identical guarantee.",
"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/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/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/reference-to-video \
--input-json '{"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"}' \
--waitВходные данные взяты из схемы этого эндпоинта — той же, что и в примерах выше. --wait дождётся завершения задачи и выведет её, а --yes пропустит подтверждение в CI. Сначала задайте SPICY_API_KEY: один ключ работает и для API, и для CLI, и для сервера MCP.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0/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 · 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/api?model=alibaba%2Fwan-3.0%2Freference-to-video" width="100%" height="560" loading="lazy" title="Пример запроса" style="border:1px solid rgba(0,0,0,.12)"></iframe>