Ir al contenido principal

Continúa un clip con Seedance 2.5: como máximo sus últimos 30 segundos sirven de referencia para un segmento nuevo de 4 a 30 segundos en 480p, 720p o 1080p, y recibes un solo archivo con tu clip y la continuación unidos.

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
# 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/video-extend",
  "input": {
    "duration_seconds": 5,
    "generate_audio": true,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "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_urlstringObligatorioAfecta al precio

El clip que se continúa: MP4, MOV o WebM, de 2 a 60 segundos. Como máximo sus últimos 30 segundos (el clip completo, si es más corto) son el material de referencia y se cobran como segundos de referencia; lo anterior no se cobra. Termínalo en el momento desde el que quieres seguir.

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

Obligatorio. Describe lo que pasa después: la acción que sigue, el movimiento de cámara y el sonido. La referencia ya trae el sujeto, el escenario y el movimiento reciente, así que dedica las palabras a cómo continúa la toma.

Valor predeterminado
Sin especificar
watermarkbooleanOpcional

Desactivado por defecto. Al activarlo, el segmento nuevo lleva una marca de agua que lo identifica como generado por IA; tu clip no se toca. No afecta el precio.

Valor predeterminado
false
seedintegerOpcional

De 0 a 2147483647. Mantenla fija para comparar cambiando un solo campo a la vez; omítela para tener variedad. Una semilla fija no garantiza un resultado idéntico.

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

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

Valor predeterminado
false
generate_audiobooleanOpcional

Activado por defecto: el segmento nuevo trae sonido generado que sigue a la referencia. El sonido de tu clip se conserva siempre; si un lado no tiene sonido, el archivo unido se completa con silencio. Elige un nivel de precio.

Valor predeterminado
true
duration_secondsintegerOpcionalAfecta al precio

Duración del segmento nuevo: cualquier número entero de 4 a 30, 5 por defecto. Los segundos de referencia de tu clip se cobran aparte, así que un segmento de 5 segundos tras un clip de 30 segundos cobra 35 segundos.

Valor predeterminado
5
Valores permitidos
456789101112131415161718192021222324252627282930
resolutionstringOpcionalAfecta al precio

Tamaño del segmento nuevo: 480p, 720p o 1080p, 720p por defecto. Solo fija la calidad del segmento nuevo, así que elige el ajuste de tu clip. 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 segmento nuevo se escala hasta llenar tu encuadre, se centra y se recorta lo que sobresale. Define el precio.

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

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/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.5 · 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