Ir al contenido principal

Seedance 2.5 Spicy es el modelo image-to-video sin censura de ByteDance que anima una imagen fija como primer cuadro, con sonido en la misma pasada. Los clips duran de 4 a 30 segundos a 480p, 720p o 1080p nativos, más un nivel 4K reescalado.

Desde $0.216/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-spicy/image-to-video",
  "input": {
    "duration_seconds": 5,
    "generate_audio": true,
    "image_url": "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.

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.

image_urlstringObligatorio

Obligatorio, y el único campo que lo es. Se convierte en el primer fotograma, así que de él salen la composición, el parecido, el vestuario, el etalonaje y el techo de calidad: una foto nítida y bien iluminada vale más que cualquier parche posterior a base de prompt. Es también la razón de que este endpoint maneje material sin censura con fiabilidad: lo que ya está en la imagen no hay que defenderlo con palabras. 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
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
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
generate_audiobooleanOpcional

Si se renderiza una banda sonora nativa sincronizada con la imagen. Activo por defecto. Apágalo para bucles mudos, para material que vayas a musicalizar después y siempre que solo estés comprobando el encuadre.

Valor predeterminado
true
duration_secondsintegerOpcionalAfecta al precio

Duración del clip terminado en segundos enteros, de 4 a 30, 5 por defecto, y la cantidad facturada: el cargo escala directamente con ella. Treinta segundos es mucho pedirle a un solo fotograma de apertura, así que confirma el movimiento en corto y alarga solo lo que se sostenga.

Valor predeterminado
5
Restricciones
minimum:4
maximum:30
resolutionstringOpcionalAfecta al precio

Resolución de salida: 480p, 720p por defecto, 1080p o 4k. El Seedance 2.5 de ByteDance renderiza de forma nativa hasta 1080p como máximo, así que aquí el escalón 4k se entrega tras una pasada extra de reescalado sobre ese render nativo: es salida reescalada, no 4K nativo, y esa pasada hace que la tarea tarde más que 1080p con la misma duración. La resolución elige un escalón de tarifa y gobierna solo el formato entregado; no añade detalle que el primer fotograma no tuviera ya. Los escalones altos significan archivos más grandes y renders más largos.

Valor predeterminado
"720p"
Valores permitidos
"480p""720p""1080p""4k"
last_image_urlstringOpcional

Fotograma de cierre opcional. Decide en qué imagen aterriza el plano: una transición, un par antes y después, o un bucle que abre y cierra en la misma foto. Mantén cámara y luz estables entre las dos y cambia un solo estado claro, o la mitad del clip se convertirá en un corte. 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
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
promptstringOpcional

Opcional aquí, y ahí está la gracia: el fotograma de apertura ya fija lo que se ve, así que al prompt solo le toca dirigir el movimiento —la acción, adónde van los ojos, la deriva de la cámara, el sonido de la habitación—. Los encargos no se revisan por nuestra parte, pero la capa propia de Seedance rechaza una banda estrecha de redacciones, el beso de la forma más constante. Mete ese momento en el fotograma en lugar de en la frase.

Valor predeterminado
Sin especificar
Restricciones
maxLength:5000

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-spicy/image-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 Spicy · Image 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