Cómo usar la API de Seedance 2.0
Tutorial paso a paso de la API de Seedance 2.0 con Node.js, Python y cURL: envía una tarea de texto a video, consulta su estado o recibe un webhook y descarga el resultado de video. El ejemplo siguiente cuesta $0,68.
- Endpoints
- 3
- Texto a video · Imagen a video · Video a partir de referencias
- Solicitud de ejemplo
- $0,68
- Texto a video
- Lenguajes
- 3
- Node.js · Python · cURL
- Generaciones fallidas
- $0
- reembolso automático
Obtener una clave de API
Crea una cuenta, añade saldo y genera una clave en Panel → Claves de API. Guárdala como CHEAPERGEN_API_KEY en tu servidor. Cada solicitud la envía como token bearer.
Elige un endpoint de Seedance 2.0
Cada tarea tiene su propio endpoint. Todos reciben un cuerpo JSON y devuelven una generación cuyo estado puedes consultar.
| Tarea | Endpoint | Obligatorio | Desde |
|---|---|---|---|
| Texto a video | bytedance/seedance-2.0/text-to-video | prompt | $0,0631 por segundo |
| Imagen a video | bytedance/seedance-2.0/image-to-video | prompt, image_url | $0,0668 por segundo |
| Video a partir de referencias | bytedance/seedance-2.0/reference-to-video | prompt | $0,0668 por segundo |
Envía un trabajo de texto a video
Este programa envía la tarea, consulta su estado cada 3 segundos hasta que termina e imprime la URL de video. Cambia el prompt y los ajustes por los tuyos.
const API = "https://cheapergen.com/api/v1";
const headers = {
Authorization: `Bearer ${process.env.CHEAPERGEN_API_KEY}`,
"Content-Type": "application/json",
};
// 1. Submit the job
let job = await fetch(`${API}/run/bytedance/seedance-2.0/text-to-video`, {
method: "POST",
headers,
body: JSON.stringify({
"prompt": "Travelling lento hacia un ceramista que da forma a un jarrón a la hora dorada; polvo en la luz y poca profundidad de campo",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5
}),
}).then((r) => r.json());
// 2. Poll until it finishes (or pass webhook_url and skip polling)
while (job.status === "queued" || job.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
job = await fetch(`${API}/generations/${job.id}`, { headers }).then((r) => r.json());
}
console.log(job.status === "succeeded" ? job.output.video.url : job.error);Configura los parámetros importantes
Los ajustes de bytedance/seedance-2.0/text-to-video y cómo afecta cada uno al precio.
| Parámetro | Tipo · valor predeterminado | Qué hace | Efecto en el precio |
|---|---|---|---|
| aspect_ratio | string (enum) · 16:9 | Formato del fotograma de salida. 16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9 | 16:9: $0,0631 por segundo |
| resolution | string (enum) · 720p | Resolución de salida. Las resoluciones más altas cuestan más por segundo. 480p · 720p · 1080p · 4k | 480p: $0,0631 por segundo 720p: $0,1356 por segundo 1080p: $0,3361 por segundo 4K: $0,6959 por segundo |
| duration | integer · 5 | Duración del clip generado en segundos (4–15s). Se cobra por segundo. | Se cobra por segundo |
| generate_audio | boolean · true | Genera sonido, ambiente y diálogos sincronizados. Sin coste adicional. | Ninguno |
| seed | integer | Usa la misma semilla y los mismos ajustes para reproducir un resultado. Déjalo vacío para usar una semilla aleatoria. | Ninguno |
Otros endpoints de Seedance 2.0 usan el mismo formato, con sus propias entradas:
POST /api/v1/run/bytedance/seedance-2.0/image-to-video
{
"prompt": "La cámara se acerca mientras ella se vuelve y sonríe; el viento le mueve el cabello",
"image_url": "https://cdn.cheapergen.com/samples/portrait.jpg",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5
}POST /api/v1/run/bytedance/seedance-2.0/reference-to-video
{
"prompt": "@Image1 saca el producto de @Image2 sobre un escritorio de mármol, siguiendo el movimiento de cámara de @Video1",
"reference_image_urls": [
"https://cdn.cheapergen.com/samples/reference-1.jpg",
"https://cdn.cheapergen.com/samples/reference-2.jpg"
],
"reference_video_urls": [
"https://cdn.cheapergen.com/samples/reference-1.mp4"
],
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5
}Obtén el resultado
Una tarea pasa de queued a running y luego a succeeded, failed o canceled. Consulta GET /api/v1/generations/{id} o proporciona webhook_url para que te enviemos el resultado mediante una solicitud POST. Descarga y guarda el resultado por tu cuenta.
{
"id": "gen_8c2QmX1nq0k4",
"object": "generation",
"model": "bytedance/seedance-2.0",
"endpoint": "bytedance/seedance-2.0/text-to-video",
"mode": "text-to-video",
"status": "succeeded",
"input": {
"prompt": "Travelling lento hacia un ceramista que da forma a un jarrón a la hora dorada; polvo en la luz y poca profundidad de campo",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5
},
"output": {
"video": {
"url": "https://cdn.cheapergen.com/outputs/gen_8c2Q.mp4",
"content_type": "video/mp4",
"duration": 5,
"width": 1280,
"height": 720
}
},
"error": null,
"cost": {
"amount_usd": 0.2255,
"currency": "usd",
"estimated": false,
"official_usd": 0.264,
"list_price_source": "official",
"list_price_label": "Official",
"saved_usd": 0.0385
},
"source": "api",
"created_at": "2026-10-15T09:21:04Z",
"started_at": "2026-10-15T09:21:06Z",
"completed_at": "2026-10-15T09:22:31Z"
}Calcula el precio antes de ejecutar una solicitud
El endpoint de cotización es gratis y no requiere una clave. Devuelve el precio, el precio oficial y tu descuento para los datos exactos que envíes.
curl -X POST https://cheapergen.com/api/v1/quote/bytedance/seedance-2.0/text-to-video \
-H "Content-Type: application/json" \
-d '{"prompt":"Travelling lento hacia un ceramista que da forma a un jarrón a la hora dorada; polvo en la luz y poca profundidad de campo","aspect_ratio":"16:9","resolution":"720p","duration":5}'| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_request | Falta un parámetro o está fuera de rango; el mensaje indica cuál. |
| 401 | unauthorized | Falta la clave de API, está mal formada o fue revocada. |
| 402 | insufficient_balance | El saldo no alcanza para el precio cotizado; añade créditos o activa la recarga automática. |
| 429 | rate_limited | Hay demasiadas solicitudes o generaciones en curso; espera un poco y vuelve a intentarlo. |
| 502 | upstream_error | El proveedor del modelo falló; se reembolsa el importe reservado y puedes volver a intentarlo. |
| 503 | model_unavailable | No hay ninguna ruta disponible en este momento; inténtalo más tarde o elige otro modelo. |
Preguntas frecuentes
