Saltar al contenido

Seedance 2.0 FastReferencia de la API

Todo lo que necesitas para llamar a Seedance 2.0 Fast desde código: un inicio rápido en tres pasos, cada campo con sus límites, la fórmula de precios, webhooks e idempotencia. La misma API /v1 ejecuta las herramientas MCP; con sesión por MCP gastas el saldo creativo, y con una clave de API, el saldo de la API para desarrolladores.

EndpointPOST /v1/videos/generationsVersión del modelodreamina-seedance-2-0-fast-260128OpenAPIllms.txtPara agentes de IA
Solicitar acceso a la API

El acceso a la API para desarrolladores requiere aprobación previa.

Inicio rápidoen tres llamadas

Configura una clave, envía la tarea con un límite de precio y luego lee el resultado.

  1. 01

    Configura tu clave

    El acceso a la API para desarrolladores requiere aprobación previa: pídelo en el estudio, en Claves de API. La clave se muestra una sola vez, así que guárdala en una variable de entorno.

    Shell
    export API_KEY="sk_test_…"
  2. 02

    Envía la tarea

    Envía el clip por POST con un Idempotency-Key y un límite max_credits (o un quote_id). Recibes un 202 y una tarea en cola de inmediato, y los créditos se retienen.

    POST /videos/generations
    curl https://api.pershot.app/v1/videos/generations \
      -H "Authorization: Bearer $API_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
        "model": "seedance-2.0-fast",
        "prompt": "Perfume mist in hard side light. Slow push-in, black background, grain.",
        "duration": 5,
        "resolution": "720p",
        "aspect_ratio": "16:9",
        "generate_audio": true,
        "max_credits": 34
      }'
    Deberías ver
    {
      "id": "job_01J9ZK4T8W",
      "object": "job",
      "kind": "video",
      "status": "queued",
      "money_status": "reserved",
      "queue_position": 2,
      "requested_model": "seedance-2.0-fast",
      "credits_quoted": 34,
      "credits_charged": null
    }
  3. 03

    Lee el resultado

    Haz GET de la tarea hasta que su estado sea succeeded. outputs[].url está firmado y caduca a las 24 horas, así que descarga lo que quieras conservar.

    GET /jobs/{id}
    curl https://api.pershot.app/v1/jobs/job_01J9ZK4T8W \
      -H "Authorization: Bearer $API_KEY"

Parámetrosy límites

Se leen del documento OpenAPI, que se genera a partir de los mismos esquemas con los que valida la API. Los campos desconocidos se rechazan.

Campos de la solicitud de Seedance 2.0 Fast
CampoTipoValores permitidosNotas
modelObligatoriostringseedance-2.0-fast · seedance-2.0-mini · autoEl id del modelo.
promptObligatoriostring2–2000 caracteresQué generar: el sujeto, la cámara y la luz.
durationPredeterminado: 5integer4–15Duración de la salida en segundos enteros, hasta 15.
resolutionPredeterminado: "720p"string480p · 720pResolución de salida. 480p para borradores, 720p para la entrega; cada una es una generación aparte.
aspect_ratioPredeterminado: "16:9"string16:9 · 9:16 · 1:1Forma del encuadre.
generate_audioPredeterminado: trueboolean–Audio nativo. El precio es el mismo, activado o desactivado.
image_urlOpcionalstringURL httpsPrimer fotograma para video; la imagen de origen para los modelos de edición. Una URL https pública o una URL de subida.
reference_image_urlsOpcionalstring[]Hasta 9 · URL httpsImágenes de referencia para el sujeto y el estilo. Refiérete a ellas en el prompt como @image1, @image2.
seedOpcionalinteger0–2.147.483.647Se acepta y se ignora: Seedance 2.0 no admite semilla.
quote_idOpcionalstringqt_…Ejecuta con una cotización de POST /v1/quotes, válida durante 10 minutos.
max_creditsOpcionalnumber> 0Lo máximo que puede costar esta tarea. Si se supera, la tarea se rechaza y nunca se cobra.
webhook_urlOpcionalstringURL httpsUna URL https que recibe los eventos de la tarea.
end_user_idOpcionalstring1–128 caracteresPara cuentas de desarrollador aprobadas (el acceso requiere aprobación previa): tu propio id de usuario para esta solicitud, visible en el uso.
project_idOpcionalstringprj_…
shot_idOpcionalstringsht_…
routing_preferenceOpcionalstringstability · speed
enhanceOpcionalobject–

Envía exactamente uno de quote_id o max_credits. Este endpoint rechaza model "auto": para video, llama primero a POST /v1/auto/plan y luego envía el modelo que elija con max_credits.

Frecuencia y concurrencia
60 solicitudes por minuto por clave y 3 tareas a la vez por cuenta de forma predeterminada. Más claves no agregan concurrencia.

Límites

Se leen de la misma tabla que usa la API para sus comprobaciones. Cada fila indica quién verifica el límite y qué pasa si se supera.

  • AplicadoLo verificamos nosotros y respondemos 400 antes de cotizar o retener nada.
  • ProveedorLo verifica el proveedor. Una tarea que rechaza falla y no se cobra nada.
  • RecomendadoNadie lo verifica. Mantenerse dentro de él da mejores resultados.
Límites de seedance-2.0-fast
LímiteValorUnidadQuién lo verificaSi se supera
Solicitud
Longitud del promptpromptDe 2 a 2000caracteresAplicado400 invalid_request en el campo prompt, antes de cualquier cotización o retención.
Prompt en inglésprompthasta 1000palabrasRecomendadoSe acepta. El modelo puede seguir con menos precisión un prompt más largo.
Prompt en chinoprompthasta 500caracteres chinosRecomendadoSe acepta. El modelo puede seguir con menos precisión un prompt más largo.
DuracióndurationDe 4 a 15Predeterminado: 5segundosAplicado400 invalid_request en el campo duration. Solo segundos enteros.
Resoluciónresolution480p, 720pPredeterminado: 720p–Aplicado400 invalid_request en el campo resolution.
Relación de aspectoaspect_ratio16:9, 9:16, 1:1Predeterminado: 16:9–Aplicado400 invalid_request en el campo aspect_ratio.
SemillaseedSe ignora–ProveedorSe acepta y no se envía: Seedance 2.0 no admite semilla, así que una semilla no repite un resultado.
Duración del video de entradainput_video_secondsDe 2 a 15segundosAplicado400 invalid_request en POST /v1/quotes. Las generaciones por API no admiten video de entrada.
Imágenes que envías
Imágenes de referenciareference_image_urlshasta 9imágenesAplicado400 invalid_request en el campo reference_image_urls.
Primer fotograma o referenciasreference_image_urlsimage_url o reference_image_urls, no ambos–Aplicado400 invalid_request en el campo reference_image_urls. Seedance 2.0 ejecuta uno de los dos modos por tarea.
Lado de la imagenimage_urlreference_image_urlsDe 300 a 6000px por ladoAplicado en archivos subidosArchivos subidos: 400 invalid_request en image_url o reference_image_urls.N, antes de cualquier cotización o retención. Otros enlaces: el proveedor rechaza la tarea y no se cobra nada.
Forma de la imagenimage_urlreference_image_urlsDe 0,4 a 2,5ancho ÷ altoAplicado en archivos subidosArchivos subidos: 400 invalid_request en image_url o reference_image_urls.N, antes de cualquier cotización o retención. Otros enlaces: el proveedor rechaza la tarea y no se cobra nada.
Tamaño de archivo subidofilehasta 10MBAplicadoPOST /v1/uploads responde 400 invalid_request en el campo file.
Formatos de archivo subidofileJPEG, PNG, WebP–AplicadoSe lee del propio archivo, no de su nombre. Cualquier otro formato: 400 invalid_request en el campo file.
Tamaño de imagen enlazadaimage_urlreference_image_urlshasta 30MBProveedorPara imágenes enlazadas desde otros servidores. El proveedor rechaza la tarea y no se cobra nada.
Formatos de imagen enlazadaimage_urlreference_image_urlsJPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF–ProveedorPara imágenes enlazadas desde otros servidores. El proveedor rechaza la tarea y no se cobra nada.
Salida
Píxeles de salida480p16:9864×4969:16496×8641:1640×640720p16:91280×7209:16720×12801:1960×960pxProveedorLos define el modelo para cada resolución y relación de aspecto.
Velocidad de fotogramas24fpsProveedorLa misma para todos los videos.
Formato de salidaMP4–ProveedorCada video es un MP4, con sonido cuando generate_audio está activado.
Enlaces
Enlace de subida7díasAplicadoDespués de eso, el enlace responde 403. Sube el archivo de nuevo.
Enlace de salida24horasAplicadoDespués de eso, el enlace responde 403. Vuelve a hacer GET de la tarea para obtener un enlace nuevo. El archivo en sí se conserva 12 meses (outputs_expire_at de la tarea indica la fecha), y más tiempo si el resultado está guardado en Recursos o se usa en un proyecto.

Nunca descargamos imágenes de otros servidores, así que para esos enlaces el proveedor verifica el tamaño, y una tarea que rechaza no se cobra. Los mismos límites se devuelven como JSON: GET /v1/models devuelve un objeto limits para cada modelo.

Precioscalculados a la vista

Cada tarea se cotiza en créditos antes de ejecutarse (1 US$ = 100 créditos). La tarifa por segundo sirve para presupuestar; POST /v1/quotes devuelve la cifra exacta.

créditos = ceil(precio de lista de BytePlus × 0,55 × 100), donde precio de lista = (s de entrada + s de salida) × ancho × alto × 24 ÷ 1024 × tarifa de lista
Precios de Seedance 2.0 Fast
EspecificaciónPor segundo (API)5 s10 s15 s
480pSin entrada de video0,031 US$Con un video de entrada: 0,019 US$/s≈ 322 s por 10 US$16 cr≈ 0,16 US$31 cr≈ 0,31 US$47 cr≈ 0,47 US$
720pSin entrada de video0,067 US$Con un video de entrada: 0,040 US$/s≈ 149 s por 10 US$34 cr≈ 0,34 US$67 cr≈ 0,67 US$100 cr≈ 1,00 US$

Las tareas rechazadas o fallidas no se cobran.

Webhookse idempotencia

Los reintentos nunca cobran dos veces y no tienes que consultar el estado periódicamente.

Idempotencia
Cada POST de generación necesita un Idempotency-Key (de 1 a 255 caracteres ASCII visibles). La misma clave dentro de 24 horas devuelve la misma tarea con HTTP 200, así que un reintento después de un tiempo de espera agotado nunca crea ni cobra una segunda tarea.
Prompts rechazados
Un prompt rechazado por la verificación previa (422 content_rejected) no crea nada, así que la misma clave puede volver a usarse con un prompt nuevo.
Eventos
job.queuedjob.processingjob.succeededjob.failedjob.cancelled
Firma
X-Signature lleva t, la hora unix, y v1, un HMAC-SHA256 de t, un punto y el cuerpo sin procesar, con tu secreto whsec_ como clave. Rechaza las marcas de tiempo de más de cinco minutos y elimina duplicados con X-Event-Id.
Entrega
Una respuesta 2xx en 10 segundos cuenta como entregada. Las entregas fallidas se reintentan después de 1 min, 5 min, 30 min, 2 h y 6 h. No se siguen las redirecciones.
Cuerpo del webhook
{
  "id": "evt_01J9ZKB1QX",
  "type": "job.succeeded",
  "created_at": "2026-09-29T14:02:31Z",
  "data": {
    "job": {
      "id": "job_01J9ZK4T8W",
      "object": "job",
      "kind": "video",
      "status": "succeeded",
      "money_status": "settled",
      "requested_model": "seedance-2.0-fast",
      "credits_charged": 34,
      "outputs": [
        {
          "kind": "video",
          "url": "https://…/job_01J9ZK4T8W.mp4?sig=…"
        }
      ]
    }
  }
}
Verificar X-Signature
import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body exactly as received, before any JSON parsing.
export function verifyWebhook(header, rawBody, secret, toleranceSec = 300) {
  let t = null;
  const signatures = [];
  for (const item of (header ?? "").split(",")) {
    const [key, value] = item.split("=", 2);
    if (key === "t") t = Number(value);
    if (key === "v1") signatures.push(Buffer.from(value, "hex"));
  }
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  return signatures.some((s) => s.length === expected.length && timingSafeEqual(s, expected));
}

// verifyWebhook(req.headers["x-signature"], rawBody, process.env.WEBHOOK_SECRET)
// Answer 2xx quickly, and skip an X-Event-Id you have already handled.

Erroresy qué hacer

Todos los errores tienen la misma forma: un objeto error con code, message, param y request_id. Los que probablemente encuentres:

CódigoHTTPQué hacer
invalid_request400Corrige el campo indicado en param.
unauthorized401Revisa la clave y el encabezado Bearer.
insufficient_credits402Recarga y vuelve a intentarlo con el mismo Idempotency-Key.
forbidden_model403Agrega el modelo o la herramienta a la lista de permitidos de la clave en el estudio, o usa otra clave. Herramientas como Mejorar necesitan su propia entrada.
quote_expired409Obtén una cotización nueva; las cotizaciones duran 10 minutos.
price_changed409El precio subió por encima de tu límite. Vuelve a cotizar o aumenta max_credits.
content_rejected422No se cobró nada. Cambia el prompt o las imágenes.
rate_limited429Espera el tiempo indicado en Retry-After y vuelve a intentarlo.
upstream_unavailable503El modelo no está disponible. Vuelve a intentarlo más tarde; una tarea que nunca empieza no se cobra.