非同期タスク
すべての Seedance 2.0 動画生成リクエストは 非同期 です。送信するとすぐにタスク ID が返り、実際の生成はバックグラウンドで進行します。次のいずれかの方法で結果を取得できます。
- ポーリング — このページのエンドポイントを定期的に呼び出して進捗を確認します
- Webhook — リクエスト送信時に
callback_urlを渡すと、システムが結果をその URL へプッシュします。Webhook を参照してください。
タスクステータスの取得
GET https://api.evolink.ai/v1/tasks/{task_id}
パスパラメータ
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
task_id | string | はい | 生成エンドポイントから返されたタスク ID |
cURL の例
curl https://api.evolink.ai/v1/tasks/task-unified-1774857405-abc123 \
-H "Authorization: Bearer YOUR_API_KEY"
タスクライフサイクル
pending → processing → completed
↘ failed
↘ cancelled
| ステータス | 意味 |
|---|---|
pending | タスクが作成されキューに入った状態。まだ開始されていない |
processing | 生成中。progress が継続的に更新される |
completed | 生成完了。results 配列に動画 URL が含まれる |
failed | 生成失敗。課金されない |
cancelled | リクエストによりタスクがキャンセルされた |
レスポンス例
Pending(送信直後)
{
"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(生成中)
{
"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
}
}
動画 URL は 24 時間有効です。 期限が切れる前に自前のオブジェクトストレージ(OSS / S3 / R2)へダウンロードしてください。
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
}
}
失敗したタスクは 課金されません。
レスポンスフィールド
| フィールド | 型 | 説明 |
|---|---|---|
id | string | タスク ID |
object | string | 常に video.generation.task |
created | integer | タスク作成の Unix タイムスタンプ |
model | string | 実際に使用されたモデル ID(送信時と一致) |
status | string | 現在のステータス — ライフサイクル表を参照 |
progress | integer | 0〜100 のパーセンテージ |
results | array<string> | completed 状態のみ存在し、動画 URL を含む |
type | string | 出力タイプ、常に video |
task_info.can_cancel | boolean | キャンセルエンドポイントを呼び出せるか |
task_info.estimated_time | integer | 残り時間の推定秒数 |
task_info.video_duration | integer | 要求された動画の長さ(秒) |
usage.billing_rule | string | 常に per_second |
usage.credits_reserved | number | 予約クレジット |
usage.user_group | string | ユーザーグループ |
ポーリングのベストプラクティス
- 5 秒間隔 がポーリング頻度と応答レイテンシーのバランスとしておすすめ
- 短い動画(4〜6 秒)は通常 1〜3 分で完了します。長い動画や複雑なマルチモーダルタスクはそれ以上かかります
- 本番パイプラインではポーリングよりも Webhook を推奨。
callback_urlはリクエスト数とコストを最小化します progressを正確な ETA として扱わないでください — 進捗インジケーターであり、モデルはステージごとに異なる速度で進行します
完全な Python の例
import os
import time
import requests
API_KEY = os.environ["EVOLINK_API_KEY"]
headers = {"Authorization": f"Bearer {API_KEY}"}
# タスクを送信
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"]
# ステータスをポーリング
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)