API Text-to-Video

Genera vídeos a partir de un prompt de texto puro. Es el modo más común de Seedance 2.0 y resulta ideal para ideación creativa, guiones publicitarios, storyboards, contenido de formato corto y cualquier escenario en el que no dispongas de material visual de referencia.

Endpoint

POST https://api.evolink.ai/v1/videos/generations

ID del modelo: seedance-2.0-text-to-video

Para una generación más rápida y un coste menor, usa seedance-2.0-fast-text-to-video: la estructura de parámetros es idéntica.

Parámetros de la solicitud

ParámetroTipoObligatorioValor por defectoDescripción
modelstringDebe ser seedance-2.0-text-to-video
promptstringDescripción del contenido del vídeo. ≤ 500 caracteres chinos o ≤ 1000 palabras en inglés
durationintegerNo5Duración del vídeo en segundos, rango 415. Facturado por segundo
qualitystringNo720pNivel de calidad: 480p o 720p. 1080p no está soportado
aspect_ratiostringNo16:916:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive
generate_audiobooleanNotrueSi se debe generar audio sincronizado (sonido ambiente, música, diálogos)
model_params.web_searchbooleanNofalseCuando está activado, el modelo decide de forma autónoma si buscar información reciente en internet. Solo se factura cuando realmente se realiza una búsqueda
callback_urlstringNoURL HTTPS para el callback al completarse la tarea. Máximo 2048 caracteres, no se permiten IPs privadas

Detalles de los parámetros

Cómo escribir un buen prompt

  • Describe el sujeto, la acción, el lenguaje de cámara (panorámica/inclinación/zoom/dolly) y la atmósfera de iluminación
  • Coloca los diálogos entre comillas dobles rectas para activar la síntesis de voz dedicada: Ella se giró y dijo: "Por fin has llegado."
  • No solicites valores específicos de relación de aspecto dentro del prompt (p. ej. "2.35:1"): usa el campo aspect_ratio en su lugar

generate_audio: false produce vídeo silencioso, sin pérdida de calidad visual y con un ligero ahorro de ancho de banda. La generación de audio en sí no tiene coste adicional.

model_params.web_search: true es útil cuando:

  • Tu prompt hace referencia a contenido temporal del tipo "más reciente", "hoy", "esta semana"
  • Necesitas anuncios de marca que mencionen eventos, personas o lugares reales
  • El modelo decide internamente si conviene buscar; si no es necesario, no se realiza ninguna búsqueda y no se cobra nada extra

Ejemplos de solicitud

cURL

curl -X POST https://api.evolink.ai/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.0-text-to-video",
    "prompt": "A macro lens focuses on a green glass frog on a leaf. The focus gradually shifts from its smooth skin to its completely transparent abdomen, where a bright red heart is beating powerfully and rhythmically.",
    "duration": 8,
    "quality": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": true
  }'

Python

import requests

response = requests.post(
    "https://api.evolink.ai/v1/videos/generations",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json"
    },
    json={
        "model": "seedance-2.0-text-to-video",
        "prompt": "A luxury watch rotating slowly on a marble surface, soft studio lighting, product showcase, cinematic",
        "duration": 8,
        "quality": "720p",
        "aspect_ratio": "16:9",
        "generate_audio": False
    }
)

task = response.json()
print(f"Task ID: {task['id']}")

Node.js

const res = await fetch("https://api.evolink.ai/v1/videos/generations", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    model: "seedance-2.0-text-to-video",
    prompt: "A cinematic sunset over the ocean, wide angle",
    duration: 5,
    quality: "720p",
    aspect_ratio: "16:9",
    model_params: { web_search: false }
  })
});

const task = await res.json();
console.log("Task ID:", task.id);

Respuesta

Una solicitud aceptada devuelve el objeto de tarea de inmediato (HTTP 200). En este momento la generación todavía no ha comenzado:

{
    "id": "task-unified-1774857405-abc123",
    "object": "video.generation.task",
    "created": 1774857405,
    "model": "seedance-2.0-text-to-video",
    "status": "pending",
    "progress": 0,
    "type": "video",
    "task_info": {
        "can_cancel": true,
        "estimated_time": 165,
        "video_duration": 8
    },
    "usage": {
        "billing_rule": "per_second",
        "credits_reserved": 50,
        "user_group": "default"
    }
}

Referencia de campos

CampoDescripción
idID de la tarea — úsalo para hacer polling de estado o para emparejar webhooks
statuspendingprocessingcompleted / failed
progressPorcentaje de 0 a 100
task_info.estimated_timeSegundos estimados hasta finalizar
task_info.video_durationDuración solicitada del vídeo
task_info.can_cancelSi todavía se puede llamar al endpoint de cancelación
usage.billing_ruleSiempre per_second
usage.credits_reservedCréditos reservados — el cargo real se liquida cuando la tarea pasa a completed

Cómo obtener los resultados

Tras enviar la solicitud hay dos formas de obtener la URL del vídeo final:

  1. PollingGET /v1/tasks/{id} cada 5 segundos. Consulta Tareas asíncronas.
  2. Webhook — pasa callback_url en la solicitud; el sistema envía un POST con el resultado cuando la tarea termina. Consulta Webhooks.

Las URLs de los vídeos generados son válidas durante 24 horas: descárgalos a tu propio almacenamiento sin demora.

Preguntas frecuentes

¿Por qué obtengo un error al pasar image_urls a text-to-video? Text-to-video no acepta entradas multimedia. Si tienes imágenes de referencia, usa image-to-video en su lugar.

¿Puedo especificar una resolución exacta en píxeles? No. quality solo expone los niveles 480p y 720p; las dimensiones reales en píxeles dependen de la combinación de aspect_ratio y quality.

¿Cómo consigo que los diálogos suenen naturales? Coloca la línea hablada entre comillas dobles rectas. El modelo lo detecta automáticamente como diálogo y ejecuta la síntesis de voz dedicada en lugar de tratarlo como narración ambiente.

Relacionado