seedintegerOpcionalDe 0 a 2147483647. Mantenla fija para comparar un campo cambiado cada vez; quítala cuando busques variedad.
- Valor predeterminado
- Sin especificar
- Restricciones
- minimum:0maximum:2147483647
El reference-to-video de Wan 3.0 Prime mantiene un rostro, vestuario, lugar o voz en un clip con hasta 10 imágenes, 5 videos y 5 archivos de audio. Entrega 2 a 30 segundos de 480p a 1080p; el video y el audio de referencia, de 15 segundos como máximo cada uno.
Los ejemplos usan las definiciones públicas de parámetros del endpoint seleccionado. Sustituye la clave de API y los medios de ejemplo, y envía la solicitud desde tu servidor.
SDK e integracioneshttps://api.spicyapi.ai/api/v1/jobs/createTaskGuarda la clave de API en la variable de entorno del servidor SPICY_API_KEY. Usa autenticación Bearer y Content-Type: application/json en las solicitudes 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-prime/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"Generado a partir del esquema de entrada de este modelo: el mismo con el que la API valida cada solicitud.
Incluye estos campos en el objeto input del cuerpo de la solicitud. Los nombres y tipos coinciden con la API. No supongas un valor predeterminado si no está indicado.
Este modelo tiene dependencias entre campos. Los marcados como obligatorios según condición dependen de otras entradas; abajo, en el JSON Schema completo, están las reglas.
seedintegerOpcionalDe 0 a 2147483647. Mantenla fija para comparar un campo cambiado cada vez; quítala cuando busques variedad.
enable_prompt_expansionbooleanOpcionalDesactivado por defecto. Al activarlo, el prompt se reescribe antes de generar: ayuda con briefs flojos y te pelea los que ya están detallados. Si no lo defines y adjuntas reference_file_url o reference_link_url, se activa en esa solicitud, porque el documento o la página se leen en este paso. Si lo pones en false de forma explícita, el archivo o la página se leen igual, pero sin reescribir el prompt.
generate_audiobooleanOpcionalActivo por defecto. El clip vuelve con el sonido ya pegado a la imagen. Ponlo en false cuando la música del plano la pongas tú.
duration_secondsintegerOpcionalAfecta al precioCualquier número entero de 2 a 30, o -1 para duración inteligente. Por defecto, 5. Con videos de referencia, su duración total más este valor no puede pasar de 30 segundos, y esos segundos se cobran además de la salida. Cierra el acabado a 5 segundos antes de alargar.
-123456789101112131415161718192021222324252627282930resolutionstringOpcionalAfecta al precio480p, 720p o 1080p. Por defecto, 720p. La resolución cambia tanto el precio como lo que tarda la tarea en volver.
"480p""720p""1080p"enable_thinkingbooleanOpcionalHace que el modelo analice el pedido y el material de referencia antes de generar. Ayuda con documentos extensos, páginas web e imágenes de referencia complejas, y hace que la generación tarde más. Desactivado por defecto; se activa solo cuando pasas un archivo o un enlace de referencia. No cambia el costo.
aspect_ratiostringOpcional16:9, 9:16, 1:1, 4:3, 3:4 o adaptive, que deja elegir al modelo. El valor por defecto es 16:9.
"16:9""9:16""1:1""4:3""3:4""adaptive"reference_link_urlstringObligatorio según condiciónUna página web pública que el modelo lee como referencia, por ejemplo un artículo, una página de producto o un perfil de personaje. Tiene que abrirse sin iniciar sesión. Algunos sitios bloquean a los lectores automáticos y una página con muy poco texto no sirve; en ambos casos la tarea falla con un mensaje de que no se pudo leer la URL, y las tareas fallidas no se cobran. No se combina con reference_file_url; si no defines enable_prompt_expansion, adjuntar un enlace también activa la expansión del prompt. Los enlaces no se cobran.
reference_file_urlstringObligatorio según condiciónUn documento que el modelo lee antes de dirigir la toma: una ficha de personaje, un guion, una lista de planos o un brief de producto. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES o NUMBERS, hasta 100 MB y 50 páginas. Funciona solo o junto a imágenes, videos y audio de referencia, pero no junto con reference_link_url. Si no defines enable_prompt_expansion, adjuntar un archivo activa la expansión del prompt en esa solicitud, porque el documento se lee en ese paso. Los archivos no se cobran.
reference_audio_urlsarray<string>Obligatorio según condiciónHasta 5 clips, cada uno de 1 a 15 segundos y 15 segundos en total: una voz, una línea de diálogo o el ambiente de una sala que el plano tenga que respetar. El audio de referencia no se cobra. WAV o MP3, 15 MB por clip. Igual que con el video, estos límites se comprueban durante la generación y no al aceptar la solicitud.
reference_video_urlsarray<string>Obligatorio según condiciónAfecta al precioHasta 5 clips, cada uno de 1 a 15 segundos y 15 segundos en total. Úsalos para el movimiento y el estilo de cámara, no para una cara. Su duración se cobra junto con la salida, y el video de referencia más la salida no pueden pasar de 30 segundos. MP4 o MOV, al menos 16 fps, de 240 a 4096 px por lado, relación de aspecto de hasta 8:1 y 100 MB por clip. Estos límites se comprueban durante la generación y no al aceptar la solicitud, así que revisa la duración de los clips antes de enviarla.
reference_image_urlsarray<string>Obligatorio según condiciónDe 1 a 10 imágenes como planchas de identidad, vestuario y decorado. Nombra cada una en el prompt —personaje, prenda, decorado— o se promedian entre sí. Las imágenes de referencia no se cobran. JPEG, PNG sin transparencia, BMP o WEBP; de 240 a 8000 px por lado, relación de aspecto de hasta 8:1 y 20 MB por imagen.
promptstringOpcionalOpcional. Si lo escribes, di primero qué controla cada referencia y luego el plano: sujeto, una acción, un movimiento de cámara, luz y sonido. Una acción clara mueve más el resultado que una lista larga de adjetivos.
{
"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 significa que la tarea se aceptó, no que haya terminado. Guarda el taskId devuelto y consulta esa tarea. No crees otra mientras esperas el resultado.
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"
}
}La respuesta de aceptación incluye la estimación para que tu aplicación pueda mostrar el mismo importe en el historial de tareas y en la facturación.
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
--data-urlencode "taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"Empieza consultando cada 2 segundos aproximadamente y ve espaciando los intentos. Párate en un estado final. Si se cae la conexión, consulta el taskId original. Vuelve a crear la tarea solo con la clave de idempotencia y el cuerpo originales.
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);
});Pasa callBackUrl al crear la tarea y recibirás el registro terminado por POST, sin un bucle de consultas de estado. Cada entrega lleva X-Webhook-Timestamp, X-Webhook-Signature y X-Webhook-Payload-Version. La firma es un HMAC-SHA256 en base64 sobre taskId.timestamp.sha256(body), así que debes verificarla con los bytes originales: si analizas el JSON y vuelves a serializarlo, los bytes cambian y la verificación falla. Las entregas fallidas se reintentan, de modo que el mismo taskId puede llegar dos veces; haz que tu manejador sea idempotente. Responde 2xx primero y haz el trabajo después: un manejador lento se trata como una entrega fallida.
Procesa output solo cuando state sea succeeded. Si falla, consulta errorCode, errorMessage y request_id. Los costos y estados de ejemplo no representan una factura real.
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "alibaba/wan-3.0-prime/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"
}
}Para cada archivo disponible, abre o descarga assets[].url directamente, sin la cabecera Authorization de la API. El enlace firmado expira en expiresAt: vuelve a consultar la tarea para renovarlo mientras el archivo siga dentro del periodo de conservación. Un archivo pendiente o no disponible no trae URL. Trata los enlaces firmados como datos privados.
Usa SpicyAPI en tu app, terminal, asistente de IA o flujo visual. Elige una guía de configuración.
No hace falta que escribas nada del código anterior. Conecta el servidor MCP una vez y cualquier agente que use MCP — Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat — podrá ejecutar este modelo por su nombre. También puedes ejecutarlo desde tu terminal con un solo comando.
Use alibaba/wan-3.0-prime/reference-to-video to make a five-second shot of a neon-lit rooftop at dusk, slow push-in, and save it to ./out/.
El agente busca el modelo en el catálogo actualizado, sube el archivo local por ti, te muestra la cotización exacta y el cargo máximo, y espera tu confirmación. No se cobra nada hasta que aceptes.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillLa primera línea le da las herramientas al agente; la segunda le da el Skill, las reglas para usarlas: consultar la cotización antes de cobrar, subir los archivos locales en lugar de pegar sus bytes y leer la URL del resultado en vez de adivinarla. Los demás clientes usan el mismo servidor desde su propio archivo de configuración: consulta el área de desarrolladores.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0-prime/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"}' \
--waitLa entrada usa el esquema de este endpoint, igual que los ejemplos de arriba. --wait consulta el estado hasta que la tarea termina y lo imprime; agrega --yes para omitir la confirmación en CI. Define antes SPICY_API_KEY: una misma clave sirve para la API, la CLI y el servidor MCP.
npx @spicyapi/cli tasks create --model alibaba/wan-3.0-prime/reference-to-video \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that applied--retention solo acorta el plazo: 30m, 1h, 7d, o 0 para borrar en cuanto la tarea llega a un estado final. Se aplica el plazo más corto entre tu solicitud, los ajustes de tu cuenta y el máximo de la plataforma. Consúltalo en el registro de la tarea en vez de asumir que se aplicó el plazo que pediste. Pedir más tiempo del que permite tu cuenta no tiene efecto.
Instala los nodos de SpicyAPI desde ComfyUI Manager o con el comando de abajo y busca Wan 3.0 Prime · Reference to Video en el lienzo. El nodo tiene las mismas opciones que esta página y muestra su precio antes de ejecutarse.
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapiEl panel incrustado lee el mismo esquema que esta página, así que no puede desincronizarse de la API. Si tu documentación necesita contenido indexable, toma el JSON de /api/embed/models/ y renderízalo tú mismo.
<iframe src="https://spicyapi.ai/embed/es/models/wan-3-0-prime/api?model=alibaba%2Fwan-3.0-prime%2Freference-to-video" width="100%" height="560" loading="lazy" title="Ejemplo de solicitud" style="border:1px solid rgba(0,0,0,.12)"></iframe>