Ir al contenido principal

El reference-to-video de Seedance 2.5 de ByteDance construye un plano con tu propio material: hasta 30 imágenes, 10 clips de video y 10 pistas de audio, sin primer cuadro. La salida dura de 4 a 30 segundos a 480p, 720p o 1080p, con audio nativo.

Desde $0.074/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": "bytedance/seedance-2.5/reference-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "duration_seconds": 5,
    "generate_audio": true,
    "output_format": "mp4",
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ]
  }
}'

# 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

Obligatorio, y aquí además hace el reparto. Las referencias se citan en el orden en que las envías, así que nombra qué imagen es qué personaje, qué aporta cada clip y para qué sirve el audio. Los encargos se aceptan sin revisión por nuestra parte; allí donde la capa propia de Seedance rechaza la redacción, un primer fotograma en image-to-video sigue siendo la ruta que llega.

Valor predeterminado
Sin especificar
watermarkbooleanOpcional

Pide al modelo que marque el video con una marca de agua de contenido generado por IA, según la documentación del propio modelo. Desactivada por defecto; actívala cuando el sitio donde publicas exija etiquetar el contenido hecho con IA. No afecta el costo.

Valor predeterminado
false
return_last_framebooleanOpcional

Devuelve además el último fotograma del clip como imagen aparte, junto al video. Envíalo a image-to-video como siguiente fotograma inicial para encadenar planos sin exportar tú el fotograma. Desactivado por defecto; no afecta el costo.

Valor predeterminado
false
seedintegerOpcional

Seed entera; si la omites, cada tirada saca la suya. Fíjala con todo lo demás constante para juzgar qué cambió realmente un retoque de prompt. Es una herramienta de comparación, no una promesa de repetición fotograma a fotograma.

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

Apagado por defecto. Al activarlo, el modelo puede buscar en la web información relacionada con tu prompt antes de renderizar. No cambia el precio.

Valor predeterminado
false
output_formatstringOpcional

El contenedor del video entregado: mp4 (por defecto) o mov. Los dos llevan la misma imagen; mov guarda el audio como PCM sin comprimir, así que el archivo pesa un poco más y entra directo en editores que prefieren QuickTime. No cambia el costo.

Valor predeterminado
"mp4"
Valores permitidos
"mp4""mov"
generate_audiobooleanOpcional

Activo por defecto. Produce una banda sonora nativa sincronizada con la imagen. Incluso aportando `reference_audio_urls`, desactivarlo significa que no se renderiza banda sonora: el audio de referencia moldea el ritmo y la interpretación, no es la pista de salida. Apágalo cuando el montaje se vaya a musicalizar en posproducción.

Valor predeterminado
true
duration_secondsintegerOpcionalAfecta al precio

De 4 a 30 segundos, 5 por defecto. Ten en cuenta que esto y la duración de tus clips de referencia son dos aportaciones independientes a la cantidad facturada, así que llevar ambas al máximo es donde una sola solicitud se encarece. Comprueba en corto que las referencias se están leyendo como pretendías antes de comprometerte con la duración final.

Valor predeterminado
5
Valores permitidos
456789101112131415161718192021222324252627282930
resolutionstringOpcionalAfecta al precio

480p, 720p o 1080p, 720p por defecto, y alimenta directamente la cantidad facturada. Fija solo el escalón de salida y no va a afilar referencias de baja resolución. Mientras aún compruebas si las referencias combinan, trabaja en 480p o 720p y sube el escalón cuando la relación entre ellas se lea bien. Aquí no existen escalones de reescalado ni de mejora.

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

Por defecto es `adaptive`. Cuando los recursos de referencia no comparten forma, la adaptativa deja que el modelo encuentre un encuadre que acoja a todos los sujetos; fijar una sola proporción hace más probable que una persona o un producto referenciado se quede fuera. Nombra una forma solo por una exigencia dura de entrega. No afecta a la facturación.

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

Hasta 10 archivos de audio de referencia, de 2 a 30 segundos cada uno y con una duración combinada no mayor de 30 segundos (la generación anterior admitía 3 archivos y 15 segundos en total). Le dan al modelo un anclaje sonoro —dicción, tempo, una frase musical— con el que se alinean el movimiento y los puntos de corte. Distinto de `generate_audio`: lo que aportas aquí es una entrada, mientras que si el clip acabado lleva banda sonora lo sigue decidiendo `generate_audio`.

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

Hasta 10 clips de referencia que aportan movimiento, ritmo o lenguaje de cámara. Cada uno dura de 2 a 30 segundos, con una duración combinada no mayor de 30 segundos: la generación anterior admitía 3 clips y 15 segundos en total, así que el presupuesto de referencia se ha duplicado y cabe citar entero un movimiento de cámara completo. Aun así, la duración de un clip de referencia sigue contando para la cantidad facturada, no como cambio de escalón sino como multiplicador lineal del mismo tipo que `duration_seconds`, de modo que un presupuesto más amplio no es motivo para subir la toma entera por costumbre. Escribe el prompt como un plano nuevo que toma prestado de estos clips. Si la redacción pide editar el propio material —quitar, sustituir o cambiar el estilo de algo—, Seedance trata la tarea como una edición de video, que necesita un ajuste de duración que este endpoint no acepta, y la tarea falla. Pedir que continúe un clip también falla, salvo que `aspect_ratio` se quede en `adaptive`.

Valor predeterminado
Sin especificar
Restricciones
maxItems:10
reference_image_urlsarray<string>Obligatorio según condición

Hasta 30 imágenes de referencia, usadas para sostener un personaje, un estilo o un decorado; la generación anterior admitía solo 9, así que aquí hay margen de verdad. Dos o tres ángulos del mismo personaje suelen funcionar mejor que diez fotogramas casi idénticos. Ojo: este endpoint no tiene parámetro de primer ni de último fotograma, porque el modo referencia y el modo fotograma se excluyen; cámbiate a image-to-video cuando el fotograma de apertura deba ser exacto. El filtro de entrada del propio Seedance puede rechazar una foto o un clip de referencia en el que se vea la cara de una persona real e identificable. Cada lado debe medir entre 300 y 6000 píxeles; el control de entrada rechaza las imágenes más pequeñas antes de cobrarte nada.

Valor predeterminado
Sin especificar
Restricciones
maxItems:30

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": "bytedance/seedance-2.5/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 Seedance 2.5 · 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