Flux 3 Image (BFL)
The FLUX 3 you can't download, wired into your graph
- config
- IMAGE
Here's what the showcase reels skip: FLUX 3 has no weights you can run. BFL announced it on 23 July 2026 as one multimodal model over image, video, audio and robot action, then shipped it as gated availability tiers - the API model is live, the open-weight FLUX 3 Dev backbone is still "coming soon" with no date. Every sample you saw was the paid endpoint. So an API node isn't the lazy option here, it's the only one.
This node is a thin wrapper around POST /v1/flux-3-image: text-to-image and editing in one node, up to 10 reference images, 4k output, bounding boxes for placement. Reach for it when you need what the model is genuinely good at - typography, multi-reference composition, prompt adherence - and you're fine with per-call metering and your inputs leaving the machine.
How it works
Your prompt and reference images get POSTed to BFL with your x-key header. It's asynchronous: you get a task id plus a polling_url, and the node polls that URL every 5 seconds - BFL requires it, because it points at the region actually holding your task. Up to 120 polls, roughly ten minutes, since 4k takes a few minutes. The result lands as a ComfyUI IMAGE tensor, re-encoded as PNG on the way in so a lossy JPEG pass doesn't recompress it.
Two things to know before you debug anything. There's no seed - BFL rejects seed, output_format and webhooks on this endpoint, so the pack doesn't pretend to expose them, and you cannot reproduce a result exactly. And failures come back as a black 512×512 image, not an exception, so the workflow keeps running: Content Moderated or Error stops polling at once and prints details to the console. Black square? The answer is in the log, not the canvas.
The inputs that actually matter
prompt is the whole ballgame, and it's where FLUX 3 differs from a local checkpoint. Bounding boxes go at the end of the prompt as a JSON list. The pack's own example workflow does it like this:
A black silhouette of a running person <runner_1> on a flat chartreuse background <background_1>.
[
{"id": "background_1", "bbox": [0, 0, 1000, 1000], "desc": "chartreuse field"},
{"id": "runner_1", "bbox": [150, 150, 850, 850], "desc": "running silhouette"}
]
Regional control you'd normally bolt on with a ControlNet and a lot of swearing - the same direction Ideogram 4 went, with boxes baked into the caption schema.
resolution (768sq–4k, default 1k) and aspect_ratio (15 ratios plus auto) are the size dials. 4k is the tier that eats minutes and credits; draft at 1k.
grounding defaults to on, and it's the setting people miss. Per the tooltip, it lets FLUX 3 research the prompt with web and image search before generating. Great for "a 1972 Datsun 240Z in a rainy Tokyo alley", annoying when you wanted your literal prompt back - and yes, the prompt gets sent out searching. Turn it off while iterating.
safety_tolerance is 0–4 (default 2), tighter than this pack's Flux Pro nodes. The image_1…image_10 sockets take the same STRING - base64 from Image to Base64 (BFL), or a URL - and they're forceInput, so there's no widget: wire a Text/Primitive String node, as the bundled example does. Your prompt calls them Image 1, Image 2, … in socket order, and skipping a socket shifts every later number. The node warns; your prompt won't know.
Output is one IMAGE. Preview it, save it, or post-process locally.
Install
ComfyUI Manager → search ComfyUI-FLUX-BFL-API, or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/gelasdev/ComfyUI-FLUX-BFL-API.git
pip install -r requirements.txt
That requirements file is literally just torch - nothing heavyweight, because there's no model to download. Grab a key at api.bfl.ai, then either edit config.ini:
[API]
X_KEY = YOUR_API_KEY
BASE_URL = https://api.bfl.ai/v1/
…or connect a Flux Config (BFL) node (key, base URL, region) to this node's config input. Prefer the node: config.ini is tracked in the repo, and a git pull can clobber your key - the complaint that got the in-node key field added back in 2024, when this pack arrived alongside Flux 1.1 Pro. Flux Credits (BFL) shows your remaining balance.
Where people get burned
- Black square, no error. That's the failure path. Read the console: every poll logs
[BFL] Poll attempt …, the terminal status, and moderationdetailswhen BFL names reasons. - Timing out around ten minutes. You're at
4kon a busy queue - drop to2kand upscale locally. - 401/403 or odd polling URLs. The key never loaded, or
BASE_URLis wrong. The pack follows thepolling_urlBFL returns; the self-builtget_result?id=is only a fallback. - Cost surprise. Metered per generation on a frontier API. Ten references at
4kin a reroll loop is not a cheap afternoon.
And the standing caveat for every API-wrapper pack: it's arbitrary Python holding your key and calling the network by design. That's the category where a malicious node's phone-home looks normal - LLMVISION is the precedent. Read the source before your first run.
Should you use it instead of local?
If you can do the job locally, do it locally. Qwen-Image-Edit and Flux 2 Klein still own instruction editing on open weights - free per call, uncensored, nothing leaving your house. This node exists for the one thing the local path can't offer: the frontier model BFL hasn't opened.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| resolution | COMBO | 1k | 5 options: 768sq, 1k, 1.5k, 2k, 4k |
| aspect_ratio | COMBO | auto | 16 options: auto, 21:9, 2:1, 16:9, 3:2, 7:5, +10 |
| grounding | BOOLEAN | true | Let FLUX 3 research the prompt with web and image search before generating |
| safety_tolerance | INT | 20–4 | — |
| image_1opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_2opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_3opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_4opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_5opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_6opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_7opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_8opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_9opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| image_10opt | STRING | Reference image (base64 from Image to Base64, or a URL). The prompt calls the connected images Image 1, Image 2, ... in socket order | |
| configopt | BFL_CONFIG | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |