Ir al contenido principal

El reference-to-video de Wan 2.6 de Alibaba lleva personas, animales u objetos de uno a tres clips de referencia a una escena nueva descrita en tu prompt. Los clips duran de 2 a 10 segundos a 720p o 1080p, en una toma o en varios planos.

El filtrado cambia según el endpoint: Imagen a video — Sin censura, Texto a video — Sin censura, Referencia a video — Con filtro.

Desde $0.065/s

Playground

Enviar una solicitud

Inicio rápido

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 integraciones
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticación de API

Guarda 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
Resultado de ejemploUsar este ejemplo
# 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-2.6/reference-to-video",
  "input": {
    "aspect_ratio": "16:9",
    "duration_seconds": 5,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "shot_type": "single",
    "reference_video_urls": [
      "https://example.com/reference.mp4"
    ]
  }
}'

# 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.

Parámetros de entrada

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.

promptstringObligatorio

La escena nueva: di qué aporta cada clip de referencia y después entorno, acción, cámara y luz. Mantenlo por debajo de 1500 caracteres. Volver a describir lo que el metraje ya muestra gasta presupuesto y a veces compite con los clips.

Valor predeterminado
Sin especificar
Restricciones
minLength:1
maxLength:1500
seedintegerOpcional

De 0 a 2147483647. Mantenla mientras cambias un clip de referencia cada vez, para que el sorteo aleatorio siga constante y solo se mueva lo que cambiaste. Es una herramienta de comparación, no una garantía de repetición idéntica fotograma a fotograma.

Valor predeterminado
Sin especificar
Restricciones
minimum:0
maximum:2147483647
shot_typestringOpcional

single mantiene una toma continua; multi deja que el modelo corte entre planos dentro de la misma escena. Multi vale la pena cuando la escena tiene ritmo; en 2 o 3 segundos rara vez hay sitio para un corte.

Valor predeterminado
"single"
Valores permitidos
"single""multi"
duration_secondsintegerOpcionalAfecta al precio

Cualquier número entero de 2 a 10, 5 por defecto. Es lo que más mueve el precio y también donde se va el parecido: comprueba el último segundo de un clip largo antes de comprometerte con esa duración.

Valor predeterminado
5
Restricciones
minimum:2
maximum:10
resolutionstringOpcionalAfecta al precio

720p o 1080p, 720p por defecto. Fija la tarifa por segundo y lo que tarda la tarea, y las dos resoluciones aceptan los cinco formatos.

Valor predeterminado
"720p"
Valores permitidos
"720p""1080p"
aspect_ratiostringOpcional

16:9, 9:16, 1:1, 4:3 o 3:4, 16:9 por defecto, disponible en ambas resoluciones; las dimensiones en píxeles de cada combinación están en las especificaciones. Aquí es un parámetro y no algo heredado de un fotograma de entrada, así que un mismo juego de referencias puede entregarse en varios formatos.

Valor predeterminado
"16:9"
Valores permitidos
"16:9""9:16""1:1""4:3""3:4"
reference_image_urlsarray<string>Obligatorio según condición

Hasta dos imágenes fijas de personajes u objetos, junto a los clips o en su lugar; sumadas a los clips, una solicitud admite como máximo cinco referencias. Se numeran después de los clips: con dos clips la primera imagen es character3 y sin clips es character1. Una imagen fija transmite bien el color y la estética, pero la forma puede salir menos fiel que con un clip, así que describe la forma en la indicación cuando importe. Las imágenes no se cobran.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:2
reference_video_urlsarray<string>Obligatorio según condiciónAfecta al precio

Hasta tres clips de los personajes u objetos que van a aparecer. Refiérete a ellos en la indicación como character1, character2 y character3, en el orden de subida: Wan reconoce el reparto solo por esos nombres, y las imágenes fijas de reference_image_urls se numeran después de los clips. El metraje corto donde el sujeto es grande en el encuadre, está bien iluminado y se ve desde más de un ángulo es el que mejor se transfiere, y los segundos que envías son facturables, así que recorta antes de subir.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:3
negative_promptstringOpcional

Lo que no debe aparecer: personas de más, rótulos, objetos del clip de referencia que no quieras arrastrar. Recurre a él cuando algo se repite entre ejecuciones, en vez de escribir todas las exclusiones de entrada.

Valor predeterminado
Sin especificar
Restricciones
maxLength:1500

Seguir la tarea

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.

Solicitud aceptada
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.

Consultar la tarea
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.

O recibe el resultado por callback
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.

Leer el resultado

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.

Ejemplo de respuesta completada
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "alibaba/wan-2.6/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.

SDK e integraciones

Usa SpicyAPI en tu app, terminal, asistente de IA o flujo visual. Elige una guía de configuración.

Úsalo en ComfyUI

Instala los nodos de SpicyAPI desde ComfyUI Manager o con el comando de abajo y busca Wan 2.6 · 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-spicyapi