BytePlus Video Query Tasks
Where did that Seedance render go? This node goes and finds it
- task_list_json
- total_tasks
The node you want after the tab closes
A Seedance render doesn't die with your ComfyUI session. It keeps running on BytePlus after you close the window, and the result sits there for 24 hours. What you lose is the graph watching it - and the task ID that was printed in the console once, on a line you scrolled past.
BytePlus Video Query Tasks is the recovery tool. It lists your recent video tasks - status, model, timestamps - as JSON. Reach for it when: a long job outlived the session, you killed the queue mid-render, you want to check whether the flex-tier job ever finished, or you have a draft_task_id from a Seedance 2.5 Draft node and want to know where the draft got to.
It's an output node - nothing to wire into it, and it runs when you hit Queue even with nothing connected. It only lists, mind you; it won't pull anybody's video back into your graph.
How it works
Read-only, and that's the whole mechanism. It calls the task-list endpoint on your ModelArk account with your paging and filters, sorts the results newest first, and hands them back as text. Nothing is generated, nothing is uploaded, and no media moves - this is a lookup against a list of your own jobs, not a render.
Two behaviours from the source explain a lot of confusion. API or network failures come back as JSON with an error field and total_tasks of 0 rather than throwing and killing the run - so a run that "succeeded" with 0 tasks is usually a bad key, not an empty account. And model_version: all queries once with no model filter, while a specific pick narrows the query.
The inputs that matter
task_ids is the one you'll change. Paste task IDs, one per line - that's what the lookup keys on. Used alone with everything else at all/default, it collects exactly those tasks. Paste an ID that doesn't come back and the node tells you instead of quietly returning nothing.
status - all, succeeded, failed, running, queued, cancelled, expired. That last one is where results go to die after the 24-hour window.
model_version - all, the current Seedance 2.5 / 2.0 / 1.0 names, and the retired ones. The pack can still query models you can't select in the UI any more, which is exactly what you need when you're hunting down a task ID from three months ago.
service_tier - default or flex, the cheaper slower queue. Filter by it when you can't remember which tier you submitted on. page_num and page_size default to 1 and 10.
And then there's seed. Yes, on a read-only query node. It exists to defeat ComfyUI's node cache: a node whose inputs haven't changed hands back its previous result without making a request, so re-queuing returns yesterday's answer. Changing the seed forces a fresh query - the shipped Seedance Task Query template sets that widget to randomize, which is the pack telling you the same thing. Same reason the README's smoke test tells you to change the prompt between runs; the plumbing doc covers the cache rule if you want the general version.
Outputs
task_list_json (STRING) - send it to Preview Any to read it, or pull a single field out with RegexExtract, which is exactly what the included template does to display the status and the model that made the clip. total_tasks (INT) is the count across everything it looked at.
Install
ComfyUI Manager → search BytePlus ModelArk (ComfyUI BytePlus ModelArk & AI MediaKit), or:
cd ComfyUI/custom_nodes
git clone https://github.com/byteplus-sa/ComfyUI-BytePlus-ModelArk
pip install -r ComfyUI-BytePlus-ModelArk/requirements.txt
Restart after installing. Needs ComfyUI 0.31.0 or newer. Then Settings → BytePlus with your ModelArk API key - BYTEPLUS_API_KEY, not the MediaKit one, since this is a ModelArk endpoint. No Comfy.org login is involved; nothing is uploaded.
Common issues
- An empty list almost always means the wrong region. Keys and models are per-region, and so are tasks: query from
eu-west-1and yourap-southeast-1renders simply aren't there. Settings → BytePlus shows which region your key is on. {"error": ...}withtotal_tasks: 0is a credential or connection problem, not an empty account. That's the node's own error path, and it's why you should always have the JSON output showing.- A filter that excludes the thing you're looking for.
status: succeededwhile the job is stillqueuedlooks identical to "gone." - Turn off every filter when recovering.
all/default/ emptytask_idslists everything recent, which is the fastest way to find an ID you never wrote down.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| page_num | INT | 1 | — |
| page_size | INT | 10 | — |
| status | COMBO | all | 7 options: all, succeeded, failed, running, queued, cancelled, +1 |
| service_tier | COMBO | default | 2 options: default, flex |
| task_ids | STRING | — | |
| model_version | COMBO | all | 9 options: all, seedance-1-0-pro, seedance-1-0-pro-fast, dreamina-seedance-2-0, dreamina-seedance-2-0-fast, dreamina-seedance-2-0-mini, +3 |
| seed | INT | 00–2147483647 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| task_list_json | STRING | — |
| total_tasks | INT | — |