Protoface Seedance 2.0 Mini · Text to Video
The cheapest way into a closed video model
- video
- files
- run id
Why you'd pay for text to video at all
If what you want is motion, run Wan or LTX locally and keep your wallet closed. If what you want is this specific look - the Seedance house style, its camera language, its willingness to do a coherent action beat in one shot - there is no local substitute, because ByteDance has never released a Seedance checkpoint. Its open releases are components: PuLID, Depth Anything, Bernini. The product stays on the API.
This node is the cheap door into that product. Mini, text-to-video, 480p or 720p, 4–15 seconds. It's the version you use when you're testing whether the model can even do your idea.
Mechanism
A shared implementation inside the Protoface pack: build a request from your prompt and settings, upload any attached references, submit, poll, download, return a native ComfyUI VIDEO. Controls are generated from the provider's public schema, so what you see is what their API accepts. Expect to wait - these are asynchronous jobs, and the pack's default poll interval is two seconds with a two-hour job timeout, so a slow queue looks like a spinning node rather than an error.
What you set
prompt is the whole input on a t2v job, and the tooltip's list - scene, action, camera movement, mood - is a decent four-part checklist. One sentence per element and you're most of the way there.
resolution: 480p or 720p. aspect_ratio: 16:9, 9:16, 4:3, 3:4, 1:1 or 21:9. duration: 4–15 whole seconds.
generate_audio defaults to true, and this tier does native synchronised audio. Mute-minded workflows should turn it off rather than pay for a track they'll discard.
The three reference_* inputs are what turn this from a toy prompt box into a targeted tool. reference_images, reference_videos and reference_audios are dynamic lists: connect native Image/Video/Audio nodes, or asset ids and public URLs, and watch the input list grow. Two use cases pay for themselves immediately - a character sheet photo to hold a face across shots, and a reference clip to borrow a colour grade.
generation_id and request_scope aren't model parameters. The first is the paid job handle: keep it fixed and a requeue resumes the same run instead of buying another; increment it to deliberately generate again. There's no seed field on these video nodes, so that integer is the only reproducibility lever you get. request_scope is auto-assigned per node and only concerns headless clients.
Outputs: video (list), files (every original asset, including non-media), run id (for Resume Run).
Install
Needs ComfyUI 0.41.0+ and Python 3.10+. Manager: Extensions → Protoface → install protoface-nodes → restart, reload browser. Manual:
cd ComfyUI
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git custom_nodes/protoface
python -m pip install -r custom_nodes/protoface/requirements.txt
Use ComfyUI's interpreter - python_embeded/python.exe on the portable Windows build. Then click Protoface bottom-right and paste your API key; headless deployments use PROTOFACE_API_KEY or PROTOFACE_API_KEY_FILE. The pack pulls httpx, jsonschema, Pillow and PyAV and nothing else heavy.
The honest cost conversation
This is the cheapest video node in the pack, and it's still a metered call. Around 8 credits per second at 720p, so a five-second clip is roughly 40 credits, and the catalog's own USD grid puts a credit near a cent. The community pushback on Seedance arriving in ComfyUI was never about quality - the top-voted replies were cost and subscription lock, and a five-second draft-then-final loop quietly doubles.
Two specifics that catch people:
Reference video is billed twice over. Attach one and its input seconds are metered on top of your output seconds, capped at 15 seconds total. Reference-driven generation is the feature most worth having and the one that inflates the invoice.
Mini has no 1080p. Every keeper has to be re-run on Fast or the standard Seedance 2.0 node, which is a new node and a new charge. Iterate at 480p, promote the winner.
Timed-out jobs aren't dead jobs. If the node gives up polling, don't bump generation_id and push again - that's a second paid job for the same render. Requeue unchanged, or recover with the run id in Resume Run.
My read
Reach for it to answer "can this model do my shot?" in under a credit's worth of regret. Don't reach for it to deliver. And if your instance is shared, remember the interactive key sits in server memory and anyone who can queue a workflow can spend it.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the scene, action, camera movement, and mood for the video. | |
| resolution | COMBO | 720p | The output video resolution. |
| duration | INT | 54–15 | The duration of the generated video in seconds (4-15s). |
| aspect_ratio | COMBO | 16:9 | The aspect ratio of the generated video. |
| generate_audio | BOOLEAN | true | Whether to generate native audio synchronized with the output video. Defaults to true. |
| reference_audios | COMBO | Public URLs, data URIs, or asset ids. | |
| reference_images | COMBO | Public URLs, data URIs, or asset ids. | |
| reference_videos | COMBO | Public URLs, data URIs, or asset ids. | |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |