Async Tasks

Every Seedance 2.0 video generation request is asynchronous. Submission returns a task ID immediately, and actual generation happens in the background. You can:

  1. Poll — call the endpoint on this page periodically to check progress
  2. Webhook — pass a callback_url when you submit; the system pushes the result to your URL. See Webhooks.

Query Task Status

GET https://api.evolink.ai/v1/tasks/{task_id}

Path Parameters

ParameterTypeRequiredDescription
task_idstringYesTask ID returned by the generation endpoint

cURL Example

curl https://api.evolink.ai/v1/tasks/task-unified-1774857405-abc123 \
  -H "Authorization: Bearer YOUR_API_KEY"

Task Lifecycle

pending  →  processing  →  completed
                      ↘    failed
                      ↘    cancelled
StatusMeaning
pendingTask created, queued, not yet started
processingGenerating; progress updates continuously
completedGeneration finished; results array contains the video URL
failedGeneration failed; not billed
cancelledTask was cancelled on request

Response Examples

Pending (just submitted)

{
    "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"
    }
}

Processing (generating)

{
    "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
    }
}

Completed

{
    "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
    }
}

Video URLs are valid for 24 hours. Download them to your own object storage (OSS / S3 / R2) before they expire.

Failed

{
    "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
    }
}

Failed tasks are not billed.

Response Fields

FieldTypeDescription
idstringTask ID
objectstringAlways video.generation.task
createdintegerUnix timestamp of task creation
modelstringThe actual model ID used (matches submission)
statusstringCurrent status — see the lifecycle table
progressinteger0–100 percent
resultsarray<string>Only present in completed state; contains the video URL(s)
typestringOutput type, always video
task_info.can_cancelbooleanWhether the cancel endpoint can still be called
task_info.estimated_timeintegerEstimated seconds remaining
task_info.video_durationintegerRequested video duration in seconds
usage.billing_rulestringAlways per_second
usage.credits_reservednumberReserved credits
usage.user_groupstringUser group

Polling Best Practices

  • 5-second interval is a good balance between poll frequency and response latency
  • Short videos (4–6 seconds) typically complete in 1–3 minutes; long videos or complex multimodal tasks take longer
  • Production pipelines should prefer Webhooks over polling. callback_url minimizes request count and cost
  • Don't treat progress as an exact ETA — it's a progress indicator; the model advances at different rates during different stages

Complete Python Example

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)