Tareas asíncronas
Toda solicitud de generación de vídeo de Seedance 2.0 es asíncrona. El envío devuelve un ID de tarea inmediatamente, y la generación real ocurre en segundo plano. Puedes:
- Polling — llama periódicamente al endpoint de esta página para comprobar el progreso
- Webhook — pasa un
callback_urlal enviar la solicitud; el sistema te entrega el resultado en tu URL. Consulta Webhooks.
Consultar el estado de una tarea
GET https://api.evolink.ai/v1/tasks/{task_id}
Parámetros de ruta
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
task_id | string | Sí | ID de tarea devuelto por el endpoint de generación |
Ejemplo con cURL
curl https://api.evolink.ai/v1/tasks/task-unified-1774857405-abc123 \
-H "Authorization: Bearer YOUR_API_KEY"
Ciclo de vida de la tarea
pending → processing → completed
↘ failed
↘ cancelled
| Estado | Significado |
|---|---|
pending | Tarea creada y en cola, aún no iniciada |
processing | En generación; progress se actualiza continuamente |
completed | Generación finalizada; el array results contiene la URL del vídeo |
failed | La generación ha fallado; no se factura |
cancelled | La tarea fue cancelada bajo petición |
Ejemplos de respuesta
Pendiente (recién enviada)
{
"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": 5
},
"usage": {
"billing_rule": "per_second",
"credits_reserved": 50,
"user_group": "default"
}
}
En proceso (generando)
{
"id": "task-unified-1774857405-abc123",
"object": "video.generation.task",
"created": 1774857405,
"model": "seedance-2.0-text-to-video",
"status": "processing",
"progress": 65,
"type": "video",
"task_info": {
"can_cancel": true
}
}
Completada
{
"id": "task-unified-1774857405-abc123",
"object": "video.generation.task",
"created": 1774857405,
"model": "seedance-2.0-text-to-video",
"status": "completed",
"progress": 100,
"results": [
"https://cdn.example.com/videos/task-unified-1774857405-abc123.mp4"
],
"type": "video",
"task_info": {
"can_cancel": false
}
}
Las URLs de vídeo son válidas durante 24 horas. Descárgalas a tu propio almacenamiento de objetos (OSS / S3 / R2) antes de que caduquen.
Fallida
{
"id": "task-unified-1774857405-abc123",
"object": "video.generation.task",
"created": 1774857405,
"model": "seedance-2.0-text-to-video",
"status": "failed",
"progress": 0,
"type": "video",
"task_info": {
"can_cancel": false
}
}
Las tareas fallidas no se facturan.
Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
id | string | ID de la tarea |
object | string | Siempre video.generation.task |
created | integer | Timestamp Unix de creación de la tarea |
model | string | El ID del modelo realmente usado (coincide con el envío) |
status | string | Estado actual — consulta la tabla del ciclo de vida |
progress | integer | Porcentaje de 0 a 100 |
results | array<string> | Solo presente en el estado completed; contiene las URLs del vídeo |
type | string | Tipo de salida, siempre video |
task_info.can_cancel | boolean | Si todavía se puede llamar al endpoint de cancelación |
task_info.estimated_time | integer | Segundos estimados restantes |
task_info.video_duration | integer | Duración solicitada del vídeo en segundos |
usage.billing_rule | string | Siempre per_second |
usage.credits_reserved | number | Créditos reservados |
usage.user_group | string | Grupo de usuario |
Buenas prácticas de polling
- Un intervalo de 5 segundos es un buen equilibrio entre frecuencia de sondeo y latencia de respuesta
- Los vídeos cortos (4–6 segundos) suelen completarse en 1–3 minutos; los vídeos largos o las tareas multimodales complejas tardan más
- Las pipelines de producción deberían preferir webhooks al polling.
callback_urlreduce el número de solicitudes y el coste - No trates
progresscomo un ETA exacto: es un indicador de progreso; el modelo avanza a ritmos distintos en cada etapa
Ejemplo completo en Python
import os
import time
import requests
API_KEY = os.environ["EVOLINK_API_KEY"]
headers = {"Authorization": f"Bearer {API_KEY}"}
# Submit task
response = requests.post(
"https://api.evolink.ai/v1/videos/generations",
headers={**headers, "Content-Type": "application/json"},
json={
"model": "seedance-2.0-text-to-video",
"prompt": "Rainy streets of Tokyo at night, neon reflections on wet asphalt",
"duration": 6,
"quality": "720p"
}
)
task_id = response.json()["id"]
# Poll for status
while True:
result = requests.get(
f"https://api.evolink.ai/v1/tasks/{task_id}",
headers=headers
).json()
status = result["status"]
print(f"[{status}] progress={result.get('progress', 0)}%")
if status == "completed":
print(f"Video URL: {result['results'][0]}")
break
if status in ("failed", "cancelled"):
print(f"Task ended with status: {status}")
break
time.sleep(5)
Relacionado
- Webhooks — Usa
callback_urlen lugar de polling - Códigos de error — Gestiona escenarios de fallo
- Inicio rápido