BFL-Flux3-Video
The only way to run FLUX 3 video from ComfyUI right now (and it costs API credits)
- keyframe_1
- keyframe_2
- start_video
- video
- video_path
- request_id
- result_json
- draft_cache_path
Let's get the framing right first, because it changes everything about this node. FLUX 3 - Black Forest Labs' July 2026 multimodal model - does not have open weights you can download. FLUX 3 Video ships as early-access API plus private weights, and the open-weight Dev backbone is still a "coming soon" promise. So if you want FLUX 3 video inside ComfyUI today, this is basically the only game in town: a thin, honest wrapper that submits jobs to BFL's hosted API, polls them, and hands you back a native VIDEO.
BFLFlux3Video is that wrapper. The name is a slight lie - nothing runs locally. The node POSTs to https://api.bfl.ai/v1/flux-3-video with your key in the X-Key header, gets back a request ID and polling URL, sleeps on poll_interval_seconds (default 2s) until status is Ready, then downloads the finished MP4 into ComfyUI/output/bfl_flux3_video/ and wraps it as a native ComfyUI VIDEO via VideoFromFile. Image keyframes get PNG/base64-encoded, a start_video gets serialized to MP4/base64, and the whole thing respects ComfyUI's interrupt signal while it waits. It's a plumbing node, and plumbing is exactly what you want here - nothing to tune, just a pipe.
The inputs that matter
The one that decides everything is mode: t2v (prompt only), i2v (one or two keyframes), v2v (continue from an existing VIDEO), or draft_enhance (upgrade a saved draft). Then it's a short list:
prompt- the actual video description.keyframe_1/keyframe_2- ComfyUIIMAGEinputs fori2v; one gives you an opening frame, two give you start and end frames.start_video- theVIDEOyou're continuing, forv2v.duration- 5–20s for t2v/i2v, 5–15s for v2v (validated before you're billed).aspect_ratio,resolution(hd/fhd),generate_audio(native audio is FLUX 3's party trick),safety_tolerance(0–4),draft.
Outputs: video (wire it straight into the next node), plus video_path, request_id, result_json for debugging, and draft_cache_path - the draft flow is worth its own paragraph.
The draft → enhance two-step
Generate with draft = true, and the node downloads BFL's draft_cache alongside the video. Wire draft_cache_path from that node into the draft_cache input of a second BFLFlux3Video set to mode = draft_enhance, and it re-renders your chosen draft at full quality. It's BFL's faster-preview-then-final loop, and the node automates both halves. Quirk: version is deliberately not sent in draft_enhance mode because BFL's schema rejects it there.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/AllenCraigBarnard/ComfyUI-BFL-Flux-3-video
pip install -r ComfyUI-BFL-Flux-3-video/requirements.txt
Then restart ComfyUI. Dependencies are just requests and Pillow - refreshingly light. Note the README's own clone command writes ComfyUI-BFL-Flux3-Video.git (stale name); the -Flux-3-video URL above is the real repo. One real requirement the README underplays: it's built on the newer comfy_api.latest extension API and a native VIDEO type, so an older ComfyUI build simply won't register it. If the node doesn't appear, update ComfyUI first.
The honest gotchas
- You pay per run. Every execution submits a job and burns credits from dashboard.bfl.ai. The node is also flagged
not_idempotent, so re-queueing re-bills even with identical inputs. - Never paste your key into the
api_keyfield if you share workflows - it gets serialized into the workflow JSON. SetBFL_API_KEYas an environment variable instead. - HTTP 402 = out of credits. HTTP 422 = a mode/field mismatch (keyframe where v2v wants
start_video, and so on). The node pre-validates most of this before submitting, which saves you from paying for mistakes. enable_this_node = falseis your kill switch for keeping multi-branch workflows from burning credits while you experiment.
BFL's API pricing and moderation terms were still settling at early access, so budget accordingly. But if you want FLUX 3 video inside ComfyUI before the weights open, this is the cleanest pipe around.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| enable_this_node | BOOLEAN | true | Enable or disable this node. When false, no BFL API request is made and downstream outputs are silently blocked. |
| prompt | STRING | example prompt | Free-form text prompt describing the video. |
| mode | COMBO | t2v | t2v = prompt only; i2v = keyframe image(s); v2v = continue from start_video; draft_enhance = full-quality render from a prior draft_cache. |
| aspect_ratio | COMBO | 16:9 | Output aspect ratio. |
| duration | COMBO | 5 | Output duration. t2v/i2v: 5-20 seconds or auto. v2v: 5-15 seconds or auto. |
| resolution | COMBO | hd | Output resolution class. |
| generate_audio | BOOLEAN | true | Generate synchronized audio with the video. |
| safety_tolerance | INT | 40–4 | BFL safety tolerance from 0 through 4. |
| draft | BOOLEAN | true | Generate a faster HD draft/preview when supported. |
| version | STRING | latest | FLUX 3 version for t2v/i2v/v2v. Ignored for draft_enhance because BFL does not permit version in that request schema. |
| api_url | STRING | https://api.bfl.ai/v1/flux-3-video | FLUX 3 video submission endpoint. |
| poll_interval_seconds | FLOAT | 2.00.5–30 | Seconds between status polls. |
| job_timeout_seconds | INT | 180030–14400 | Maximum time to wait for generation. |
| http_timeout_seconds | INT | 12010–600 | Timeout for each individual HTTP request. |
| filename_prefix | STRING | flux3_video | Prefix used for downloaded files. |
| keyframe_1opt | IMAGE | First keyframe for i2v. | |
| keyframe_2opt | IMAGE | Optional second/end keyframe for i2v. | |
| start_videoopt | VIDEO | Existing video for v2v continuation. | |
| draft_cacheopt | STRING | Required for draft_enhance. Accepts draft_cache_path from a previous draft run, a local path, URL, data URL, or raw base64. | |
| api_keyopt | STRING | Optional BFL API key. If blank, reads BFL_API_KEY from the environment. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| request_id | STRING | — |
| result_json | STRING | — |
| draft_cache_path | STRING | — |