bytedance/seedance-2.0-fast/reference-to-videoDesde 17 créditos por un clip de 5 segundos· Referencias a video

El reference-to-video de Seedance 2.0 Fast de ByteDance construye un plano con tu propio material: hasta 9 imágenes, 3 clips de video y 3 pistas de audio, sin primer cuadro. La salida dura de 4 a 15 segundos a 480p o 720p, con sonido en la misma pasada.

Llámalo con el nombre de modelo bytedance/seedance-2.0-fast/reference-to-video en POST /jobs/createTask, desde 17 créditos por un clip de 5 segundos (0,17 US$). Las cuentas nuevas reciben 30 créditos gratis para que lo pruebes primero en el Playground.

  • Crear video
  • Imagen a video
  • Referencias a video
  • Extender video
  • Hasta 720p
  • Clips de 4 a 15 s
  • Con sonido
  • Fotograma inicial y final
  • Hasta 9 imágenes de referencia
  • 6 relaciones de aspecto
Nombre del modelobytedance/seedance-2.0-fast/reference-to-video
EndpointPOST https://api.popnow.ai/api/v1/jobs/createTask
# 1. Create the task. Keep the Idempotency-Key if you retry after a network error.
export IDEMPOTENCY_KEY="$(uuidgen)"
curl -X POST https://api.popnow.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
  "model": "bytedance/seedance-2.0-fast/reference-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "reference_image_urls": [
      "https://media.popnow.ai/influencer/examples/ava.webp"
    ],
    "aspect_ratio": "adaptive",
    "resolution": "720p",
    "duration_seconds": 5,
    "generate_audio": true
  }
}'

# 2. Copy data.taskId from the response, then poll until state is succeeded, failed, canceled or expired.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

El input se genera a partir del esquema de abajo, así que pasa la validación tal cual. Cambia el prompt y los enlaces por los tuyos.

Precio

OpciónCréditos por segundo≈ USD
resolution 480pwith_video true3,380,034 US$
resolution 480pwith_video false6,750,068 US$
resolution 720pwith_video true7,270,073 US$
resolution 720pwith_video false14,520,15 US$

1 crédito = 0,01 $ · Todas las opciones y su precio: GET /models/bytedance/seedance-2.0-fast/reference-to-video

Cada tarea se redondea al alza a créditos enteros, así que una ejecución en el nivel más bajo cuesta 17 créditos por un clip de 5 segundos (0,17 US$).

Límites

Duración del clip
4–15 s
Resoluciones
480p · 720p
Relaciones de aspecto
16:9 · 9:16 · 4:3 · 3:4 · 1:1 · 21:9 · adaptive
Audio de referencia
3
Imágenes de referencia
9
Vídeos de referencia
3
Clip de entrada más largo
15 s

Parámetros

Estos campos salen del mismo esquema con el que validamos cada petición. Los campos que no aparecen se rechazan.

Algunos campos dependen entre sí (por ejemplo, al menos una referencia). El esquema completo de abajo tiene las reglas exactas.

  • promptstringObligatorio

    Describe the intended subject, action, camera, light, sound, and constraints.

    Rango
    1 – … chars
  • reference_image_urlsarray<string>A veces obligatorio

    Imágenes de las personas, prendas o lugares que el resultado debe mantener.

    Rango
    0 – 9 items · image/jpeg, image/png, image/webp, image/gif
  • reference_video_urlsarray<string>A veces obligatorioCambia el precio

    Clips cuyo movimiento, cámara o estilo debe seguir el resultado.

    Rango
    0 – 3 items · video/mp4, video/webm, video/quicktime
  • reference_audio_urlsarray<string>Opcional

    Audio que imitar: una voz, una música o un ritmo.

    Rango
    0 – 3 items · audio/mpeg, audio/wav
  • aspect_ratiostringOpcional

    La forma del encuadre: horizontal, cuadrado o vertical.

    Por defecto
    "adaptive"
    Valores permitidos
    "16:9""9:16""4:3""3:4""1:1""21:9""adaptive"
  • resolutionstringOpcionalCambia el precio

    Tamaño de salida. Más grande es más nítido y cuesta más.

    Por defecto
    "720p"
    Valores permitidos
    "480p""720p"
  • duration_secondsintegerOpcionalCambia el precio

    Cuánto dura el clip. Se cobra por segundo.

    Por defecto
    5
    Valores permitidos
    -1456789101112131415
  • generate_audiobooleanOpcionalCambia el precio

    Añade sonido acorde a la imagen: voces, ambiente y efectos.

    Por defecto
    true
  • seedintegerOpcional

    Repite el mismo número para obtener un resultado reproducible.

    Rango
    0 – 2147483647
  • return_last_framebooleanOpcional

    Also return the clip’s final frame as a separate image.

    Por defecto
    false
  • bitrate_modestringOpcional

    Encoding bitrate of the delivered file: standard, or high for crisper detail and a larger file.

    Por defecto
    "standard"
    Valores permitidos
    "standard""high"
  • watermarkbooleanOpcional

    Add the model’s visible "AI generated" watermark to the video.

    Por defecto
    false
Esquema JSON sin procesar
{
  "additionalProperties": false,
  "anyOf": [
    {
      "required": [
        "reference_image_urls"
      ]
    },
    {
      "required": [
        "reference_video_urls"
      ]
    }
  ],
  "properties": {
    "aspect_ratio": {
      "default": "adaptive",
      "description": "Output frame ratio.",
      "enum": [
        "16:9",
        "9:16",
        "4:3",
        "3:4",
        "1:1",
        "21:9",
        "adaptive"
      ],
      "type": "string"
    },
    "bitrate_mode": {
      "default": "standard",
      "description": "Encoding bitrate of the delivered file: standard, or high for crisper detail and a larger file.",
      "enum": [
        "standard",
        "high"
      ],
      "type": "string"
    },
    "duration_seconds": {
      "default": 5,
      "description": "Requested output duration in seconds. Pass -1 for smart duration: the model picks the length itself instead of a fixed number.",
      "enum": [
        -1,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
        13,
        14,
        15
      ],
      "type": "integer"
    },
    "generate_audio": {
      "default": true,
      "description": "Request synchronised output audio.",
      "type": "boolean"
    },
    "prompt": {
      "description": "Describe the intended subject, action, camera, light, sound, and constraints.",
      "minLength": 1,
      "type": "string"
    },
    "reference_audio_urls": {
      "description": "Authorised audio references.",
      "items": {
        "contentMediaType": [
          "audio/mpeg",
          "audio/wav"
        ],
        "type": "string"
      },
      "maxItems": 3,
      "type": "array"
    },
    "reference_image_urls": {
      "description": "Authorised image references.",
      "items": {
        "contentMediaType": [
          "image/jpeg",
          "image/png",
          "image/webp",
          "image/gif"
        ],
        "type": "string"
      },
      "maxItems": 9,
      "type": "array"
    },
    "reference_video_urls": {
      "description": "Authorised video references.",
      "items": {
        "contentMediaType": [
          "video/mp4",
          "video/webm",
          "video/quicktime"
        ],
        "type": "string"
      },
      "maxItems": 3,
      "type": "array"
    },
    "resolution": {
      "default": "720p",
      "description": "Output resolution.",
      "enum": [
        "480p",
        "720p"
      ],
      "type": "string"
    },
    "return_last_frame": {
      "default": false,
      "description": "Also return the clip’s final frame as a separate image.",
      "type": "boolean"
    },
    "seed": {
      "description": "Random seed. Omit to let the model pick one.",
      "maximum": 2147483647,
      "minimum": 0,
      "type": "integer"
    },
    "watermark": {
      "default": false,
      "description": "Add the model’s visible \"AI generated\" watermark to the video.",
      "type": "boolean"
    }
  },
  "required": [
    "prompt"
  ],
  "type": "object"
}

Un resultado real de Seedance 2.0 Fast

PromptTreat @Image1, @Image2 and @Image3 as three angles of one sneaker. Rotate it smoothly on an invisible turntable through those three views in order, keeping the leather grain, gum sole and lacing identical throughout. Hard studio key stays fixed; the contact shadow swings with the rotation.
La misma petición a través de la API
{
  "model": "bytedance/seedance-2.0-fast/reference-to-video",
  "input": {
    "prompt": "Treat @Image1, @Image2 and @Image3 as three angles of one sneaker. Rotate it smoothly on an invisible turntable through those three views in order, keeping the leather grain, gum sole and lacing identical throughout. Hard studio key stays fixed; the contact shadow swings with the rotation.",
    "reference_image_urls": [
      "https://media.popnow.ai/influencer/examples/ava.webp"
    ],
    "aspect_ratio": "1:1",
    "resolution": "720p",
    "duration_seconds": 5,
    "generate_audio": true
  }
}

Este resultado partió de un archivo subido: pon tu propio enlace donde está el de ejemplo.

Respuestas, consultas y callbacks

Todos los modelos funcionan igual: crea una tarea y luego consulta su estado o espera el callback.

Consulta el precio primero

cURL
curl -X POST https://api.popnow.ai/api/v1/jobs/quote \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "bytedance/seedance-2.0-fast/reference-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "reference_image_urls": [
      "https://media.popnow.ai/influencer/examples/ava.webp"
    ],
    "aspect_ratio": "adaptive",
    "resolution": "720p",
    "duration_seconds": 5,
    "generate_audio": true
  }
}'

El mismo cuerpo que createTask. Devuelve el cargo esperado y el máximo posible, sin ejecutar nada.

Aceptada

HTTP
HTTP/1.1 202 Accepted

{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued"
  },
  "request_id": "req_example_create"
}

HTTP 202 significa que la tarea se aceptó y los créditos quedan reservados, todavía sin cobrar. El cargo final nunca supera la reserva.

Consultar estado

cURL
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

Consulta cada pocos segundos espaciando cada vez más y para cuando state sea succeeded, failed, canceled o expired.

Tarea terminada

JSON
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "bytedance/seedance-2.0-fast/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "url": "https://cdn.popnow.ai/tasks/task_01k3m8x9q2z4v7n5p6r8s0t1w3/output.mp4?signature=FROM_RESPONSE",
          "expiresAt": "2026-10-17T12:20:00Z",
          "mime": "video/mp4",
          "width": 1280,
          "height": 720,
          "durationSeconds": 5
        }
      ]
    },
    "settled": true
  },
  "request_id": "req_example_record"
}

Descarga desde la url antes de expiresAt. ¿Necesitas un enlace nuevo más tarde? Pídelo con POST /common/download-url.

Verificar un callback

Node.js
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
import express from "express";

const app = express();
// express.raw keeps the exact bytes that were signed; express.json would not match.
app.post("/hooks/popnow", express.raw({ type: "application/json" }), (req, res) => {
  const timestamp = req.header("X-Webhook-Timestamp");
  const signature = req.header("X-Webhook-Signature") ?? "";
  const body = JSON.parse(req.body.toString("utf8"));
  const taskId = body.data?.taskId ?? body.task_id;
  const digest = createHash("sha256").update(req.body).digest("hex");
  const expected = createHmac("sha256", process.env.POPNOW_WEBHOOK_SECRET)
    .update(`${taskId}.${timestamp}.${digest}`)
    .digest("base64");
  const ok = expected.length === signature.length && timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
  // Check the signature first, then reject anything older than five minutes.
  if (!ok || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.status(401).end();
  res.status(200).end(); // answer fast, then fetch the task and store its files
});

Con callBackUrl te enviamos la tarea terminada. Comprueba la firma sobre el cuerpo sin procesar antes de fiarte de ella.

Enviar un archivo local

cURL
curl -X POST https://api.popnow.ai/api/v1/common/upload-url \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contentType": "image/png", "bytes": 482113}'

# PUT the file bytes to data.uploadUrl with every header in data.headers, then commit it:
curl -X POST https://api.popnow.ai/api/v1/files/$FILE_ID/commit \
  -H "Authorization: Bearer $POPNOW_API_KEY"
# The commit returns a popnow://f/... reference. Put it in any image, video or
# audio field of the task input instead of a public https URL.

Los enlaces https públicos funcionan tal cual. Los archivos locales pasan antes por upload-url y commit.