FLUX.2 [pro] is the everyday FLUX.2 tier for photoreal work: product shots, lifestyle scenes and packaging mockups with text you can actually read. Black Forest Labs released it in November 2025 as the production tier of the family. It takes a prompt of up to 5,000 characters and up to eight references, and returns one image per request.
It is a good default for catalogs and ads where the same product has to look the same in every picture.
What you can make
- Product photos and lifestyle scenes that pass for a real shoot
- One product or character kept consistent across a whole set
- Box, label and shop sign mockups with legible lettering
- Fixed-size 1K or 2K output for an automated pipeline
Settings that matter
resolution:1K(default) or2K. Exact pixel sizes are not available on Kadraris yet.aspect_ratio: 1:1, 4:3, 3:4, 16:9, 9:16, 3:2 or 2:3.autoonly works with references attached.image_urls: up to 8. Say in the prompt what each one is for: the product, the model, the setting, the style.- Describe the camera like a photographer would: lens, aperture, light setup.
- Wrap in-image text in quotes and say where it sits and in what lettering.
Starter prompt
Glass bottle of cold brew on a marble kitchen counter,
85mm lens, f/2.8, morning backlight, label reads
"NORTH ROAST" in bold sans serif, condensation dropsReplace the product and label text, and keep the lens and light notes for a matching catalog set.
Questions
What does FLUX.2 [pro] cost per image?
from $0.0688 per image. Studio shows the estimate before you send, and a failed generation costs $0.
I need bigger files than 2K. What now?
Use FLUX.2 [max], which goes up to 4 MP. The Z-Image vs FLUX.2 pro and FLUX.2 pro vs Nano Banana Pro pages compare other options.
Is [flex] a cheaper version of [pro]?
FLUX.2 [flex] has the same 1K and 2K presets and 8 references but a different look. Run one prompt on both and keep the one you like.
FLUX.2 [pro] in your code
curl https://kadraris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $KADRARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "flux-2-pro",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "1K"
}
}'import os, time, requests
API = "https://kadraris.com/v1"
H = {"Authorization": f"Bearer {os.environ['KADRARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "flux-2-pro",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "1K"
}
}).json()
while task["status"] in ("queued", "running"):
time.sleep(3)
task = requests.get(f"{API}/tasks/{task['id']}", headers=H).json()
print(task["status"], task["cost"], [o["url"] for o in task["output"]])const API = "https://kadraris.com/v1";
const headers = { Authorization: `Bearer ${process.env.KADRARIS_API_KEY}`, "Content-Type": "application/json" };
let task = await (await fetch(`${API}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
"model": "flux-2-pro",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "1K"
}
}),
})).json();
while (task.status === "queued" || task.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
task = await (await fetch(`${API}/tasks/${task.id}`, { headers })).json();
}
console.log(task.status, task.cost, task.output.map((o) => o.url));
Input fields
| Parameter | Type | Allowed | Default |
|---|---|---|---|
prompt * | string | ≤ 5000 chars | |
aspect_ratio | string | 1:1 4:3 3:4 16:9 9:16 3:2 2:3 auto | 1:1 |
resolution | string | 1K 2K | 1K |
image_urls | array | max 8 |
Fetch this list as JSON with GET /v1/models/flux-2-pro.


























