Por qué usar dos modelos en lugar de uno
Seedance 2.0 puede generar vídeo directamente a partir de texto, así que ¿por qué crear primero una imagen? Porque el rendimiento de un anuncio depende de la precisión del producto, y un prompt de texto no puede reproducir de forma fiable tu botella, etiqueta y envase reales. La solución es fijar primero el producto real en una imagen estática y después animar exactamente esa imagen.
Seedream 5.0 Pro es la parte de imagen. Es un modelo de texto a imagen y edición de imágenes que planifica la composición antes de renderizarla, escribe texto sobre la imagen en 14 idiomas con formas de letras correctas y acepta hasta 10 imágenes de referencia para tratar tu envase real como fuente de verdad. Seedance 2.0 es la parte de vídeo: el modelo de ByteDance que convierte texto, imágenes y referencias en vídeo y genera audio sincronizado en la misma pasada, en lugar de añadir una voz en off después (la arquitectura y la afirmación sobre el audio nativo aparecen en el artículo de arXiv). Solo el modo de referencia a vídeo de Seedance 2.0 permite entregarle la imagen de Seedream y decirle: «mantén este producto y crea una escena a su alrededor».
Una foto de entrada, diez vídeos de salida y el producto consistente en todos ellos. Esa es toda la idea.

La cadena de dos modelos: Seedream 5.0 Pro crea la imagen estática y Seedance 2.0 la anima.
El cálculo de costes que determina si merece la pena
Primero comparé las cifras, porque este es el dato que realmente justifica crear el flujo.
| Diez anuncios verticales terminados de 15 segundos | Este flujo de trabajo (API) | Diez vídeos de creadores humanos |
|---|
| Imagen principal | $0.081 (una imagen estática Seedream 2K, reutilizada) | incluida por sesión |
| 10 vídeos | ~$24.95 (10 × 720p, Seedance de 15 s) | — |
| Total para 10 anuncios | ≈ $25 | $1,500–3,000 |
| Derechos de uso en anuncios de pago | incluidos | +25–30 % |
| Tiempo de producción | una tarde | ~una semana |
Eso equivale a $2.58 por anuncio terminado de 15 segundos. Los precios proceden de las páginas de GPT Proto para Seedream 5.0 Pro y Seedance 2.0 (un 10 % por debajo de la tarifa de ByteDance); el rango para creadores humanos procede de encuestas de tarifas UGC de 2026. Mi conclusión —y esto es una valoración, no una afirmación medida— es que el dinero ni siquiera es la principal ventaja. La verdadera ganancia es que crear variaciones pasa a ser gratis: ejecutas una foto de producto con diez prompts y obtienes diez enfoques para probar mediante A/B en lugar de uno.
Lo que necesitas
Una cuenta de GPT Proto con una clave de API, Python 3 con requests, una foto de producto alojada en una URL pública y unos 30 dólares de saldo para ejecutar un par de veces el lote completo de diez anuncios. Obtén la clave en tu panel —tiene un aspecto similar a sk-...— y pégala como valor sin modificar del encabezado Authorization, exactamente como muestran los documentos, sin el prefijo Bearer.
Paso 1 — Convierte la foto del producto en una imagen principal
Ambos modelos son asíncronos: envías un trabajo mediante POST, recibes un id de predicción y después consultas GET /api/v3/predictions/{id}/result hasta que status sea succeeded. Este es un pequeño sistema de consulta que reutilizaremos en ambos pasos.
import requests, json, time
API_KEY = "sk-xxxxx" # paste your key directly, no "Bearer"
HEADERS = {"Authorization": API_KEY, "Content-Type": "application/json"}
BASE = "https://gptproto.com/api/v3"
def submit(path, payload):
r = requests.post(f"{BASE}/{path}", headers=HEADERS, data=json.dumps(payload))
r.raise_for_status()
return r.json()["data"]["id"]
def wait(pred_id, every=5, timeout=600):
deadline = time.time() + timeout
while time.time() < deadline:
r = requests.get(f"{BASE}/predictions/{pred_id}/result", headers=HEADERS)
data = r.json()["data"]
if data["status"] == "succeeded":
return data["outputs"][0]
if data["status"] in ("failed", "expired"):
raise RuntimeError(f"job {data['status']}: {data.get('error')}")
time.sleep(every)
raise TimeoutError("polling timed out")
Ahora toma la única foto del producto y colócala en una escena con la tarea image-edit. Escríbelo como un briefing de diseño, no como un pie de foto: coloca primero las reglas de composición y deja los adjetivos de estilo para el final; menciona directamente la iluminación, porque ahí reside el realismo de Seedream. Limítalo a unas 30–80 palabras y usa un tamaño vertical 2K para que la imagen coincida con un fotograma de vídeo 9:16.
product_photo = "https://your-cdn.com/serum-bottle.png" # the one photo you start with
edit_prompt = (
"Place this matte-black serum bottle on a wet bathroom counter, "
"soft window light from the left, water droplets on the glass, "
"shallow depth of field, photoreal product photography, keep the label exactly as shown"
)
img_id = submit(
"bytedance/dola-seedream-5-0-pro-260628/image-edit",
{"prompt": edit_prompt, "images": [product_photo], "size": "1600*2848"},
)
hero_image_url = wait(img_id)["url"] # feed this into Seedance next
print(hero_image_url)
La misma llamada en cURL, por si primero la estás probando desde el terminal:
curl --location 'https://gptproto.com/api/v3/bytedance/dola-seedream-5-0-pro-260628/image-edit' \
--header 'Authorization: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{"prompt":"Place this matte-black serum bottle...","images":["https://your-cdn.com/serum-bottle.png"],"size":"1600*2848"}'
Observa que el formato de size usa un asterisco (1600*2848), no una x. Una imagen 2K cuesta 0,081 dólares; la misma toma en 1K (832*1248) baja a 0,0405 dólares para pruebas de conceptos desechables. La primera imagen de referencia es gratuita; las referencias adicionales cuestan 0,0027 dólares cada una, hasta 10.
Paso 1: la misma botella, trasladada de una toma de estudio sencilla a una escena lista para UGC.
Paso 2 — Escribe el prompt UGC (aquí es donde fallan la mayoría de los anuncios)
Un prompt publicitario para Seedance es un briefing de planos, no una descripción, porque el modelo crea la imagen y el sonido en una sola pasada. Estructúralo en cuatro capas: sujeto y escena, gancho durante los primeros 0–3 segundos, momento del producto entre los segundos 4–10 y un fotograma final limpio. Pon las frases habladas entre comillas dobles y mantenlas cortas; los monólogos largos pierden sincronización labial.
La trampa que casi todo el mundo encuentra es pulir demasiado el resultado. El instinto es pedir iluminación cinematográfica y un movimiento de cámara dramático, pero en un feed UGC eso parece falso. Un clip creíble debería parecer grabado por una persona real en su baño con un móvil: ligeramente grabado a mano, con luz natural de ventana y sin brillo de estudio. Tampoco mezcles dos ideas en un mismo prompt: un formato por generación.

Las cuatro capas que necesita todo prompt UGC de Seedance 2.0.
Paso 3 — Anima la imagen principal con Seedance 2.0
Este es el paso que omiten las guías del entorno de pruebas. Usa reference-to-video y pasa la URL de Seedream en images: así mantienes el producto exacto en pantalla. Haz coincidir duration con el ritmo que escribiste en el prompt, establece 9:16 para TikTok y Reels y deja activado generate_audio para que el diálogo se renderice de forma nativa.
video_prompt = (
"UGC-style phone video, vertical, a woman in her late twenties in a bright bathroom "
"holding the serum bottle to camera with easy creator energy, slightly handheld, "
"natural window light. She says: \"Okay this one actually cleared my skin in a week.\" "
"Cut to a macro close-up of the dropper. Ends on the bottle held up, label facing camera."
)
vid_id = submit(
"bytedance/dreamina-seedance-2-0-260128/reference-to-video",
{
"prompt": video_prompt,
"images": [hero_image_url], # product consistency comes from here
"aspect_ratio": "9:16",
"duration": 15,
"resolution": "720p",
"generate_audio": True,
"seed": -1,
},
)
print(wait(vid_id, every=10)["url"]) # video takes longer -- poll less often
curl --location 'https://gptproto.com/api/v3/bytedance/dreamina-seedance-2-0-260128/reference-to-video' \
--header 'Authorization: sk-xxxxx' \
--header 'Content-Type: application/json' \
--data '{"prompt":"UGC-style phone video...","images":["HERO_IMAGE_URL"],"aspect_ratio":"9:16","duration":15,"resolution":"720p","generate_audio":true}'
Si prefieres animar un único fotograma inicial sin el sistema completo de referencias, image-to-video utiliza un solo campo image en lugar del array images y funciona igual en todo lo demás.
Paso 4 — Crea las diez variaciones por lotes
Esta es la ventaja de hacerlo con código: diez enfoques requieren el mismo esfuerzo que uno. Repite la llamada de vídeo con diez prompts diferentes usando la misma imagen principal, envíalos todos y después recopila las URL.
angles = [
"...opens on a splash of water, energetic hook, 'wait for it'...",
"...opens mid-sentence, skeptical creator tone, 'I did not expect this'...",
"...opens on the product already in hand, calm morning-routine demo...",
"...street-style, walking and talking, quick to-camera line...",
"...close friend recommendation, sitting on the bathroom floor...",
# ...ten total, one format each
]
jobs = [
submit("bytedance/dreamina-seedance-2-0-260128/reference-to-video",
{"prompt": p, "images": [hero_image_url], "aspect_ratio": "9:16",
"duration": 15, "resolution": "720p", "generate_audio": True})
for p in angles
]
clips = [wait(j, every=10)["url"] for j in jobs]
for i, url in enumerate(clips, 1):
print(f"ad {i}: {url}")

Una imagen principal y diez enfoques publicitarios: el lote del paso 4.
Especificaciones y precios de salida de Seedance 2.0
| Resolución | Relación de aspecto | Duración | Precio por ejecución |
|---|
| 480p | 16:9 | 4 s | $0.3094 |
| 720p | 16:9 | 15 s | $2.4948 |
| 1080p | 16:9 | 15 s | $6.1746 |
| 4K | 16:9 | 15 s | $12.83 |
Las resoluciones disponibles son 480p, 720p, 1080p y 4K; las duraciones, de 4 a 15 segundos, en seis relaciones de aspecto (9:16, 1:1, 16:9, 4:3, 3:4 y 21:9). A 720p, 16:9 se renderiza a 1280×720 y 1080p a 1920×1088. Para redes sociales de pago, elegiría 720p en 9:16: es el punto ideal por coste y la compresión del feed elimina gran parte de la diferencia de 1080p. Las tablas completas están en la página del modelo Seedance 2.0 y en la página del modelo.
Los errores que realmente causan problemas
La discrepancia de duración es la más silenciosa: si tu prompt está pensado para 15 segundos pero dejas duration en el valor predeterminado de 5, el modelo acelera o recorta la escena. Haz que coincidan. Un 503 de la API es un rechazo por la política de contenido (se devuelve como 400): reformula y vuelve a enviarlo en lugar de reintentarlo a ciegas. Un 403 suele indicar saldo insuficiente, no una clave incorrecta. Y si un clip parece un anuncio de lujo, eso no es una victoria para una ubicación UGC: rebaja el prompt hacia «grabado con un móvil».
Antes de publicar
Considera cada resultado como un borrador de anuncio, no como una pieza terminada. Revisa las afirmaciones sobre el producto, los derechos de imagen de la foto que subiste, la política publicitaria de la plataforma y las normas de divulgación de IA aplicables en tu mercado antes de invertir en un clip. La IA elimina el coste de producción, no la responsabilidad por lo que dice el anuncio.
Cada imagen de esta publicación —la portada y las cuatro ilustraciones— se generó con Seedream 5.0 Pro por unos 0,24 dólares en total. El mismo flujo y la misma clave.