Nodes/comfyui-jz/jz BytePlus Seedance (video)
ComfyUI Node

jz BytePlus Seedance (video)

A $0.62 video with no undo button

By j-zhang19·Created 2 months ago·Updated 5 days ago· 3
jz BytePlus Seedance (video)
  • first_frame
  • last_frame
  • reference_images
  • video
  • task_id
  • applied
  • usage
◄prompta cat walking through grass►
◄modelseedance-1-0-pro-250528►
◄resolution720p►
◄ratio16:9►
◄duration5►
◄fps24►
◄camera_fixedfalse►
◄watermarkfalse►
◄seed-1►
◄custom_model►
◄api_key►
◄regionap-southeast►
◄poll_timeout900►
◄poll_interval3►

Seedance has no open weights. You can't download it, and no VRAM number makes it run locally - it's an API product, one of the closed video models the community measures open models against. So if you want Seedance frames sitting next to your local upscaler in the same graph, you call it. This node is one of the calls, and unlike most of the wrappers around it, it was clearly written by someone who got a surprise bill.

Worth saying up front: j-zhang19/comfyui-jz is a personal pack - the author's own words - and it has essentially zero Reddit footprint (searching the pack name across r/comfyui, r/StableDiffusion and r/civitai returns nothing). There's no reputation to lean on here, in either direction. Seedance itself, though, is one of the most-discussed video models in the corpus, ~775 threads across the first seven months of 2026, so the model is very much wanted and this is a small pack trying to serve that want.

How it works, and why it's paranoid

Verbose: the node POSTs a generation task to BytePlus ModelArk, polls it until it settles, downloads the result, and hands you a native VIDEO. Synchronous it is not - you'll watch it poll.

The interesting part is the flag system. Seedance parameters don't live in a JSON body. They ride as text flags appended to your prompt: --rs (resolution), --rt (ratio), --dur, --fps, --wm, --cf, --seed. And the server only validates two of them. A bad value on the others gets dropped silently - you're charged full price for a perfectly valid video that isn't the one you asked for.

The author's answer to that is the reason to prefer this wrapper over a thinner one:

  • every flag is whitelisted client-side before the submit, so a typo fails locally and costs nothing
  • the token estimate and dollar figure print before the request goes out
  • the billable POST is sent once, no retries - a retried submit whose first attempt actually landed would bill twice
  • applied echoes back the parameters the server really used
  • seed is deliberately not control_after_generate

That last one matters more than it looks. A running Seedance task cannot be cancelled - DELETE comes back 409. The moment the POST returns, the money is spent. So re-queuing a graph re-spends, which is exactly what an auto-randomised seed would invite.

The inputs that matter

prompt is your text; the flags get appended for you. model defaults to seedance-1-0-pro-250528 and is populated from the live Ark catalogue (cached 24h, so it never blocks ComfyUI startup), with the curated favourites pinned on top; custom plus custom_model reaches anything not listed.

Then: resolution (default 720p), ratio (default 16:9), duration in seconds (default 5), fps (default 24), camera_fixed, watermark, seed. Leave api_key empty - the node resolves it server-side from the BYTEPLUS_API_KEY env var, the pack's .env, or [BYTEDANCE] ARK_API_KEY in config.ini, and keys baked into workflow JSON are a bad habit. region must match where your key was issued, and poll_timeout / poll_interval control the waiting.

Optional image sockets: first_frame, last_frame, and reference_images (every frame in the batch becomes a reference). That's how you get image-to-video and reference-guided shots.

Outputs: video (a native VIDEO - wire it to a video sink, core's SaveVideo or a VHS combine node), task_id (keep it), applied, and usage.

Install

Manager → search comfyui-jz, or:

cd ComfyUI/custom_nodes
git clone https://github.com/j-zhang19/comfyui-jz

Restart ComfyUI. Dependencies are requests, pillow, numpy - nothing heavy, no model downloads. Put your key in ComfyUI/custom_nodes/comfyui-jz/.env:

BYTEPLUS_API_KEY=your-key-here

Both .env and config.ini are gitignored.

Where people get burned

resolution: auto is the expensive one. It omits the flag, and the API then defaults to 1080p. Set it explicitly unless you meant to spend.

A 401 that is really a region problem. BytePlus keys are region-scoped, and a key issued for ap-southeast fails on eu-west with wording about the key being "missing or invalid" - which reads like a bad key. The node's error message now says the region is the likely cause. Check the region widget first.

Check applied. If the server dropped a flag, that string is where you find out. A silent drop is a paid-for wrong video.

A timeout is not a loss. If the poll runs past poll_timeout, the task keeps running and stays fetchable - reads are free and tasks live 48 hours. Don't hit queue again. Grab the task_id and use jz BytePlus Seedance Fetch.

Cost, for scale: 1080p / 16:9 / 5s / 24fps is 246,840 tokens, about $0.62 on seedance-1-0-pro. It scales linearly with resolution, duration and fps, so doubling the clip doubles the bill. seedance-1-0-pro-fast runs $1.00 per million tokens against the pro model's $2.50.

Categoryjz/api

Inputs (17)

NameTypeDefaultDescription
promptSTRINGa cat walking through grass—
modelCOMBOseedance-1-0-pro-2505285 options: seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-5-260628, dreamina-seedance-2-0-mini-260615, custom
resolutionCOMBO720pauto omits the flag and the api defaults to 1080p, the most expensive option
ratioCOMBO16:99 options: auto, 16:9, 9:16, 4:3, 3:4, 1:1, +3
durationINT50–60seconds; 0 omits the flag. cost scales linearly
fpsINT240–600 omits the flag
camera_fixedBOOLEANfalse—
watermarkBOOLEANfalse—
seedINT-1-1–2147483647-1 omits it. deliberately NOT control_after_generate: a re-queue would spend again
first_frameoptIMAGE—
last_frameoptIMAGE—
reference_imagesoptIMAGEevery frame becomes a reference_image
custom_modeloptSTRING—
api_keyoptSTRING—
regionoptCOMBOap-southeast2 options: ap-southeast, eu-west
poll_timeoutoptINT90030–7200—
poll_intervaloptINT31–30—

Outputs (4)

NameTypeDescription
videoVIDEO—
task_idSTRING—
appliedSTRING—
usageSTRING—