arkennemasis fal · Seedance 2.5 Image to Video · $0.22-1.16/s
The frame you approved, now moving with sound
- image
- end_image
- video
- video_path
- seed
- draft_id
- info
Seedance is the video model the local community measures everything against and can't run. bytedance.json is unambiguous about the posture: the entire Seedream/Seedance line is API-only, and it's been that way through every version. So you either call it or you don't use it.
ArkFal_bytedance_seedance_2_5_image_to_video is the friendliest entry point to that line. One still frame, a prompt describing the motion, and you get up to 30 seconds of video with synchronized audio - sound effects, ambience, and lip-synced speech generated together, not bolted on. Pricing is per second: $0.22 at 480p, $0.47 at 720p, $1.16 at 1080p.
What you set
image- required. The starting frame; JPEG, PNG or WebP, max 30MB. This is the whole reason to prefer image-to-video over text-to-video: the composition is already decided.prompt- the motion and action. Keep it about movement; the picture is already handled. It can be empty, but you'll get more with it than without.end_image- optional, and genuinely useful. Supply a last frame and the clip transitions from the start image to it. Two-frame control without the dedicated endpoint.resolution-720pdefault,480pfor speed,1080pfor quality. This is the price dial, and it isn't linear: 1080p is two and a half times 720p.draft- off by default. Turn it on and the run becomes a 480p preview that overrides your resolution setting and returns adraft_idyou can complete at 1080p within seven days. Cheapest sane way to find out whether a prompt works before committing $10.duration-auto, or 4–30 seconds. The model decides when left toauto.generate_audio- on by default and it costs nothing either way, so there's no reason to turn it off unless your NLE is fussy.bitrate_mode-standardorhigh; high asks for a larger, better encode. Doesn't change the price.codec-auto(default),H264orH265.
Shared optional controls: max_cost_usd (default $20 - with a 30-second 1080p clip well above that, this node is exactly what the cap is for), reuse_identical_run (on; identical inputs come back from disk without a second charge), extra_json, max_concurrent.
Outputs: video, video_path, seed, draft_id (empty unless you drafted), info.
The money, plainly
At 720p the node is about $0.47 per second, so a 10-second clip is $4.70. That's the real price, not a markup by this pack - and the KB records the community's response to exactly this number when Seedance hit ComfyUI, which was mostly sticker shock plus the counter-argument that the cheap years were a subsidy. I'd only add: use the draft toggle. It's the difference between a two-dollar check and an eleven-dollar gamble.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart, or install through ComfyUI Manager by searching arkennemasis. Then your key goes in a .env in the folder holding run_nvidia_gpu.bat (or your ComfyUI folder):
FAL_KEY=your-key-from-fal.ai/dashboard/keys
No key input on the node - deliberate, so a key can't be saved into a shared workflow. Nothing to download; the weights are ByteDance's and they don't leave the API.
Where people get burned
Interfaces that don't ship as draft_id: if you turn draft on and then close the tab, the id is in this node's outputs and in output/fal/_requests.jsonl, and it's only good for seven days and only for the account that made it. Grab it while it's hot.
The rest is the usual API-node arithmetic. Your source image and prompt go to fal and on to ByteDance's model, with their filter in the loop - no local workaround, because there's nothing local to patch. The estimate reads your resolution and duration when both are set explicitly, and shows a rate when you leave things on auto. Files are saved to output/fal/bytedance_seedance-2.5_image-to-video/.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The text prompt describing the desired motion and action for the video. Empty leaves it out. | |
| image | IMAGE | The URL of the starting frame image to animate. Supported formats: JPEG, PNG, WebP. Max 30 MB. | |
| resolution | COMBO | 720p | Video resolution - 480p for faster generation, 720p for balance, 1080p for high quality. |
| draft | BOOLEAN | false | Generate a draft preview at 480p, overriding resolution. Returns a draft_id for completing the draft at 1080p within seven days. |
| duration | COMBO | auto | Duration of the video in seconds. Supports 4 to 30 seconds, or auto to let the model decide based on the prompt. |
| generate_audio | BOOLEAN | true | Whether to generate synchronized audio for the video, including sound effects, ambient sounds, and lip-synced speech. The cost of video generation is the same regardless of whether audio is generated or not. |
| bitrate_mode | COMBO | standard | Output bitrate mode. 'high' requests a higher-quality, larger-file encode from the model; 'standard' uses the default bitrate. |
| codec | COMBO | auto | 'auto' retains default video codec behaviour; 'H264' uses H.264; 'H265' uses H.265. |
| end_imageopt | IMAGE | The URL of the image to use as the last frame of the video. When provided, the generated video will transition from the starting image to this ending image. Supported formats: JPEG, PNG, WebP. Max 30 MB. | |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap. |
| reuse_identical_runopt | BOOLEAN | true | If these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings. |
| extra_jsonopt | STRING | Advanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally. | |
| max_concurrentopt | INT | 11–32 | How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| seed | INT | — |
| draft_id | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |