Ir al contenido principal

El text-to-video de Seedance 2.0 Mini de ByteDance construye todo el cuadro desde un prompt, con sonido en la misma pasada. Los clips duran de 4 a 15 segundos a 480p o 720p, en siete proporciones incluida la adaptativa, o el modelo elige la duración.

Desde $0.025/s30% por debajo del precio oficial

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.0-mini/text-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "aspect_ratio": "adaptive",
    "bitrate_mode": "standard",
    "generate_audio": true,
    "duration_seconds": 5
  }
}'

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

promptstringObligatorio

La única fuente de lo que aparece en pantalla. Ordénalo como sujeto, acción, cámara, luz, sonido, una idea por frase. Las redacciones no las revisamos nosotros, pero la capa propia de Seedance rechaza una parte antes de renderizar: el beso es el disparador fiable, mientras que un susurro al oído o dos frentes que se tocan sí pasan. Para un resultado literal, conduce el momento desde un primer fotograma en image-to-video.

Valor predeterminado
Sin especificar
Restricciones
minLength:1
watermarkbooleanOpcional

Añade al video la marca de agua visible «AI generated» 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
bitrate_modestringOpcional

Tasa de bits del archivo entregado: `standard` (por defecto) o `high`. `high` conserva más nítidas las texturas finas y el movimiento rápido con la misma resolución y genera un archivo bastante más pesado; la resolución, la cadencia y la duración no cambian. No afecta el costo.

Valor predeterminado
"standard"
Valores permitidos
"standard""high"
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
generate_audiobooleanOpcional

Determina si se renderiza una banda sonora nativa sincronizada con la imagen. Activo por defecto; apagarlo no baja la tarifa en esta versión. Apágalo para bucles mudos y para material que vayas a musicalizar después.

Valor predeterminado
true
duration_secondsintegerOpcionalAfecta al precio

Duración del clip final en segundos enteros, de 4 a 15, 5 por defecto, y la cantidad facturable: el costo crece en proporción directa. Con -1 la duración la decide el modelo: la estimación supone 15 segundos y el cobro sigue la duración entregada. Los segundos extra sirven para terminar una acción, no para meter una segunda idea; las piezas más largas se construyen encadenando tomas.

Valor predeterminado
5
Valores permitidos
-1456789101112131415
resolutionstringOpcionalAfecta al precio

Resolución de salida: 480p o 720p por defecto. Elige un escalón de tarifa, y los escalones altos significan archivos más grandes y renders más largos. Boceta en 480p mientras la redacción todavía se mueve y súbela una sola vez para la toma que quieras conservar.

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

Encuadre de salida: adaptive por defecto o una de seis proporciones fijas, del 21:9 al 9:16. Sin imagen que seguir, adaptive deja que el modelo elija la forma que sugiere el prompt; indica una proporción fija cuando la ubicación ya la impone. No afecta a lo que se te factura.

Valor predeterminado
"adaptive"
Valores permitidos
"16:9""9:16""4:3""3:4""1:1""21:9""adaptive"

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/text-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.0 Mini · Text 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