Seedance 2.0 Query Task (Volcengine)
Grab your finished video by task ID
- video_path
- video_url
- last_frame_path
- last_frame_url
- task_id
- status
- response_json
This is the sibling node you reach for after you've met Seedance 2.0 Generate. Where Generate submits a video task to ByteDance's API-only Seedance model and (optionally) waits for it, Query Task does the boring but essential job: you hand it a task_id, it asks Volcengine Ark how the generation is going, and if it's done it downloads the mp4 to ComfyUI/output/seedance/ for you. No GPU, no local model - just a polite HTTP poll, which makes sense for a model whose weights were never released and only exist behind an API key.
Why you'd use it at all
Because Generate's wait_for_result toggle is a trap for queues. With it on (the default), the node sits on ComfyUI's execution thread sleeping between polls for up to 30 minutes, and everything behind it in the queue just... waits. The recommended pattern is to turn wait_for_result off on the Generate node, let it return the task_id instantly, keep the rest of your queue moving, and check in on jobs later with this node. It's also the way to recover a generation you kicked off outside ComfyUI entirely - Ark returns task IDs from raw API calls, and any of them work here as long as they're from the same account.
How it works
It's a single GET against the Ark endpoint contents/generations/tasks/{task_id} using your key. If the status is succeeded, it extracts the video URL (and last-frame URL, if present), downloads what you asked for, and returns paths. If it's still running, you get an empty video_path and a status you can inspect - run it again, or wire it to loop. The mechanism is plain urllib; this pack has no extra runtime dependencies beyond what ComfyUI already ships.
Inputs (there are only four)
api_key- same key as the Generate node. The node reads it from this field first, then falls back to theARK_API_KEY(orVOLCENGINE_ARK_API_KEY) environment variable. Paste it in or set the env var so it never gets baked into a saved workflow.task_id- the only thing you actually change each run. Wire it straight from the Generate node'stask_idoutput, or type one in.download_video(default true) - whether to save the mp4 locally. Turn this off if you only want the URL or the status.download_last_frame(default false) - fetch the last frame too, if the task produced one.
base_url defaults to the Ark v3 endpoint and you won't touch it unless you're proxying through a region-appropriate mirror.
Outputs
Identical to the Generate node's seven: video_path, video_url, last_frame_path, last_frame_url, task_id, status, and response_json. For a finished task, video_path is the file on disk that feeds the rest of your workflow; response_json is your debugging friend when a job went sideways.
Install
You're installing the whole pack either way - this node ships in the same repository as Generate:
cd ComfyUI/custom_nodes
git clone https://github.com/kuangrenaigc-stack/ComfyUI-Volcengine-Seedance
Restart ComfyUI and look under the Volcengine/Seedance category (or search "Seedance" in the node palette). Via ComfyUI Manager, search for "Volcengine Seedance". There are no model downloads and nothing heavy to pip install, so the only real setup is having an Ark API key, which - the recurring gotcha with Chinese cloud APIs - historically required a Chinese phone number to obtain.
Where people get burned
- No key, no query. Even reading a task status needs the API key. The node raises "Missing Ark API key" if neither field nor env var has one - the
_env_api_key()helper checksARK_API_KEY,VOLCENGINE_ARK_API_KEY, andVOLCENGINE_API_KEY, so pick one and be consistent. - Blank task_id. The node errors immediately if it's empty; it won't guess. If your Generate node ran with
wait_for_resultoff and never executed, you have no ID to query. - Only downloads on success.
download_videois checked inside thestatus == "succeeded"branch - a failed or still-running task returns empty paths, not a stale file. - Gone after expiry. Ark tasks carry an expiry (Generate's
execution_expires_afterdefaults to 48 hours). Querying a long-expired task returns an error, and that's Ark being Ark, not the node.
It's a deliberately tiny utility, and that's fine: in the Generate-plus-Query pairing it's the half that stops your ComfyUI queue from being held hostage by a five-minute video render. For a workflow that runs more than one generation, it earns its place.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| task_id | STRING | — | |
| download_video | BOOLEAN | true | — |
| download_last_frame | BOOLEAN | false | — |
| base_url | STRING | https://ark.cn-beijing.volces.com/api/v3 | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |
| video_url | STRING | — |
| last_frame_path | STRING | — |
| last_frame_url | STRING | — |
| task_id | STRING | — |
| status | STRING | — |
| response_json | STRING | — |