FLUX.2 [max] is the tier to use for the final image, the one that goes on a billboard draft or a campaign landing page. Black Forest Labs released it in December 2025 as the quality and detail flagship of FLUX.2. It works from a text prompt or from up to eight reference pictures and returns one image per request.
I would draft on a cheaper tier and switch to [max] only once the prompt is settled.
What you can make
- Campaign hero shots where close-up detail is visible
- 4 MP files for large prints and outdoor mockups
- Close-ups of materials: knitwear, skin, brushed metal, plated food
- The polished last version of an idea drafted on FLUX.2 [pro]
Settings that matter
resolution: 1MP, 2MP (default), 3MP or 4MP. Keep 4MP for images people will see big.aspect_ratio: nine options from 1:1 to 21:9 and 9:21.seed: fix it while you tweak wording, so changes in the image come from the prompt, not chance.image_urls: up to 8 references per request.- Be precise about surfaces, for example "oiled walnut" or "frosted glass", rather than "wood" or "glass".
Starter prompt
Close-up of a hand-knit wool sweater sleeve on oiled
walnut, soft window light from the left, visible fiber
texture, shallow depth of field, muted autumn paletteChange the material and the surface it rests on, and keep the light direction for a consistent series.
Questions
How much does a FLUX.2 [max] image cost?
from $0.154 per image. You pay only for images that finish; a failed one costs $0.
How is [max] different from [pro]?
Both accept 8 references. [max] goes from 1 to 4 MP and has a seed, while [pro] offers 1K or 2K presets here. Use [pro] for volume and [max] for the keeper.
Can I get the same image again?
Yes. Send the same prompt, settings and seed to reproduce a result.
FLUX.2 [max] 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-max",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "2MP"
}
}'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-max",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "2MP"
}
}).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-max",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "2MP"
}
}),
})).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 | ||
aspect_ratio | string | 1:1 4:3 3:4 16:9 9:16 3:2 2:3 21:9 9:21 | 1:1 |
resolution | string | 1MP 2MP 3MP 4MP | 2MP |
num_images | integer | 1-1 | 1 |
image_urls | array | max 8 | |
seed | integer |
Fetch this list as JSON with GET /v1/models/flux-2-max.























