Ir al contenido principal

Continúa un clip con Seedance 2.0 Mini: el último fotograma de tu video abre un nuevo segmento de 4 a 15 segundos con sonido, y recibes un solo archivo con el original y la continuación unidos, en 480p o 720p.

Desde $0.025/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
# 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.0-mini/video-extend",
  "input": {
    "bitrate_mode": "standard",
    "duration_seconds": 5,
    "enable_web_search": false,
    "generate_audio": true,
    "resolution": "720p",
    "video_url": "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.

video_urlstringObligatorio

El clip que se va a continuar: MP4, MOV o WebM, de hasta 60 segundos. Su último fotograma se convierte en el fotograma inicial del nuevo segmento, así que córtalo en un fotograma limpio y nítido. El original no se cobra.

Valor predeterminado
Sin especificar
Restricciones
minLength:1
format:"uri"
contentMediaType:["video/mp4","video/webm","video/quicktime"]
watermarkbooleanOpcional

Añade al nuevo segmento la marca de agua visible «AI generated» propia del modelo. Desactivado por defecto; actívalo cuando el lugar donde publicas exija etiquetar el material hecho con IA. No afecta al precio.

Valor predeterminado
false
bitrate_modestringOpcional

Tasa de bits de codificación del nuevo segmento tal como lo entrega el modelo: `standard` (por defecto) o `high`. High mantiene más nítidos los detalles finos y el movimiento rápido y hace el archivo del segmento mucho más grande; la plataforma vuelve a codificar el archivo unido. No afecta al precio.

Valor predeterminado
"standard"
Valores permitidos
"standard""high"
seedintegerOpcional

Entero de 0 a 2147483647; si lo omites, cada ejecución elige el suyo. Fíjalo para comparar un campo cambiado a la vez; es una herramienta de comparación, no una promesa de repeticiones idénticas fotograma a fotograma.

Valor predeterminado
Sin especificar
Restricciones
minimum:0
maximum:2147483647
enable_web_searchbooleanOpcionalAfecta al precio

Desactivado por defecto. Activado, el modelo puede buscar en la web información relacionada con tu prompt antes de generar el nuevo segmento. Las solicitudes con búsqueda activada se facturan con la tarifa de búsqueda web, más alta que la estándar; la estimación que ves antes de enviar ya la incluye.

Valor predeterminado
false
generate_audiobooleanOpcional

Activado por defecto, así que el nuevo segmento trae sonido generado; desactivarlo no baja el precio en este nivel. Tu original conserva su propio sonido en cualquier caso; si un lado no tiene sonido, el archivo unido se completa con silencio.

Valor predeterminado
true
duration_secondsintegerOpcionalAfecta al precio

Duración del nuevo segmento en segundos enteros: de 4 a 15, o -1 para que el modelo elija; en ese caso se reservan 15 segundos de entrada y el cobro se ajusta a la duración entregada. Por defecto 5. Tu original se suma por delante y no se cobra.

Valor predeterminado
5
Valores permitidos
-1456789101112131415
resolutionstringOpcionalAfecta al precio

Tamaño del nuevo segmento: 480p o 720p, 720p por defecto. Iguálala a tu original: solo fija la calidad del nuevo segmento, y un ajuste menor hace que la parte nueva se vea más suave que el original. El archivo unido conserva el encuadre de tu clip sin barras negras; para que la unión encaje, la imagen puede recortarse o ajustarse unos puntos porcentuales en los bordes. Si el modelo devuelve una proporción claramente distinta, el nuevo segmento se escala hasta llenar tu encuadre, se centra y se recorta lo que sobresale. Define el precio.

Valor predeterminado
"720p"
Valores permitidos
"480p""720p"
last_image_urlstringOpcional

Fotograma final de destino, opcional: el nuevo segmento termina en esta imagen en lugar de acabar donde el modelo decida. Útil para una transición o para volver a un fotograma conocido. Dale las mismas proporciones que al último fotograma de tu clip, o se recorta para ajustarse. Cada lado debe medir entre 300 y 6000 píxeles; una imagen más pequeña la rechaza la validación de entrada antes de cobrarte.

Valor predeterminado
Sin especificar
Restricciones
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
promptstringOpcional

Opcional. Qué pasa después: la acción que sigue, el movimiento de cámara y el sonido. Si lo omites, el modelo decide el movimiento a partir del último fotograma. El fotograma inicial ya fija el sujeto y el escenario, así que usa las palabras para el movimiento.

Valor predeterminado
Sin especificar
Restricciones
minLength:1

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.0-mini/video-extend",
    "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.0 Mini · Video Extend 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