Poll a Seedance video task by id on CometAPI with GET /v1/videos/. Works for Seedance 1.0 Pro, 1.5 Pro, and 2.0 tasks. Returns the current status, progress, and the signed video_url after the task reaches completed.
curl https://api.cometapi.com/v1/videos/<TASK_ID> \
-H "Authorization: Bearer <COMETAPI_KEY>"{
"id": "task_abc123",
"object": "video",
"model": "doubao-seedance-2-0",
"status": "in_progress",
"progress": 30,
"created_at": 1777385418,
"completed_at": 1777385485
}Use this endpoint to read the state of a task created through Create a Seedance video. TheDocumentation Index
Fetch the complete documentation index at: https://apidoc.cometapi.com/llms.txt
Use this file to discover all available pages before exploring further.
id in the path is the value returned by the create call, regardless of which Seedance model produced the task.
The response body is the video task object itself. Read status, progress, and video_url at the top level.
queued and in_progress are non-terminal; completed, failed, and error are terminal and the task will not move again.
| Status | Meaning | Terminal |
|---|---|---|
queued | Accepted and queued for rendering. | no |
in_progress | Rendering in progress. | no |
completed | Finished. video_url is present in the response. | yes |
failed | The provider rejected the task. | yes |
error | An internal error prevented completion. | yes |
import time
import requests
TASK_ID = "<TASK_ID>"
headers = {"Authorization": "Bearer <COMETAPI_KEY>"}
TERMINAL = {"completed", "failed", "error"}
while True:
response = requests.get(
f"https://api.cometapi.com/v1/videos/{TASK_ID}",
headers=headers,
timeout=15,
)
response.raise_for_status()
data = response.json()
if data["status"] in TERMINAL:
print(data.get("video_url"))
break
time.sleep(10)
status — drives the stop condition for your polling loop.progress — integer 0 to 100 that you can surface in a UI.video_url — signed download URL, present on completed responses. Seedance downloads use this URL directly instead of a separate /v1/videos/{id}/content route. The signature is time-limited; download or re-host the file before the signature expires.completed_at — optional Unix timestamp returned by the platform. Do not use it to stop polling; use status instead.model — echoes the Seedance model id used when the task was created.400 with message: "task_not_exist" means the id is unknown. Confirm that you captured the id from a successful POST /v1/videos response and that you use it verbatim.401 means the bearer token is missing or invalid. Check that the request header is Authorization: Bearer <COMETAPI_KEY>.Bearer token authentication. Use your CometAPI key.
Task id returned by POST /v1/videos.
Current Seedance video task state.
Task id.
Object type, always video.
Model id that generated the task.
Task status. queued and in_progress are non-terminal. completed, failed, and error are terminal.
queued, in_progress, completed, failed, error Completion percentage.
0 <= x <= 100Task creation time as a Unix timestamp in seconds.
Signed download URL for the finished video. Present on completed responses. Seedance downloads use this URL directly instead of a separate /v1/videos/{id}/content route. The signature is time-limited, so download or re-upload the file to your own storage soon after you receive it.
Optional Unix timestamp returned by the platform. Use status, not this field, to decide when polling can stop.
curl https://api.cometapi.com/v1/videos/<TASK_ID> \
-H "Authorization: Bearer <COMETAPI_KEY>"{
"id": "task_abc123",
"object": "video",
"model": "doubao-seedance-2-0",
"status": "in_progress",
"progress": 30,
"created_at": 1777385418,
"completed_at": 1777385485
}