FLUX 3 Image Klein
flux-3-kleinOur GPUsText to imageImage editing
Black Forest Labs' step-distilled FLUX 3 Klein on VelvetAPI's own GPUs: text to image, and edits from up to ten of your own generated images.
Tips
- Write a full scene caption: subject, setting, lighting and style. Klein is tuned for detailed descriptions and does noticeably worse with short requests.
- For edits, pass up to ten of your own earlier output URLs as
reference_imagesand refer to them in the prompt as "the first image", "the second image" and so on. - It's step-distilled: 4 to 16 steps (16 by default), and there's no guidance scale or negative prompt.
- Sizes run from 256 to 2,048 pixels per side in multiples of 16. Without a size you get 1,024 × 1,024, or the size of the first reference image.
Inputs
Send these in the task's input object. Only required fields are needed; GET /v1/models/flux-3-klein returns them as a JSON Schema.
| Field | Type | Default | Details |
|---|---|---|---|
promptrequired | string | — | A full scene caption. Klein expects detailed descriptions of subject, setting, lighting and style, not short requests. up to 20,000 characters |
width | integer | — | Multiple of 16. Defaults to 1024, or the first reference image's width. 256 to 2,048 · multiple of 16 |
height | integer | — | Multiple of 16. Defaults to 1024, or the first reference image's height. 256 to 2,048 · multiple of 16 |
steps | integer | — | Sampling steps (default 16). 4 to 16 |
seed | integer | — | 0 to 2,147,483,647 |
num_images | integer | 1 | 1 to 4 |
reference_images | array of URLs | [] | Output URLs of images this account generated. The caption refers to them as "the first image", "the second image" and so on. up to 10 items |
loras | array of objects | [] | Up to three LoRA presets by name. up to 3 items |
loras[].sourcerequired | string | — | |
loras[].scale | number | 0.8 | 0 to 4 |
output_format | string | "jpeg" | one of jpeg, png, webp |
Example
Create a task with your API key, then poll it or pass a webhook_url. user is your own id for the end user who asked for the image.
curl https://api.velvetapi.dev/v1/tasks \
-H "Authorization: Bearer $VELVET_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "flux-3-klein",
"user": "user-123",
"input": {
"prompt": "A candid photograph of a woman with auburn hair reading on a sunlit balcony, soft morning light, 35mm film grain."
}
}'import { VelvetAPI } from "@velvetapi/sdk";
const velvet = new VelvetAPI({ apiKey: process.env.VELVET_API_KEY });
const task = await velvet.tasks.create({
model: "flux-3-klein",
user: "user-123",
input: {
prompt: "A candid photograph of a woman with auburn hair reading on a sunlit balcony, soft morning light, 35mm film grain.",
},
});
const done = await velvet.tasks.wait(task.id);
console.log(done.state, done.outputs.map((output) => output.url));import os
from velvetapi import VelvetAPI
client = VelvetAPI(api_key=os.environ["VELVET_API_KEY"])
task = client.tasks.create(
model="flux-3-klein",
user="user-123",
input={
"prompt": "A candid photograph of a woman with auburn hair reading on a sunlit balcony, soft morning light, 35mm film grain.",
},
)
done = client.tasks.wait(task["id"])
print(done["state"], [output["url"] for output in done["outputs"]])Response 202 Accepted
{
"id": "0b9c6c2e-4d3f-4a51-9a8e-2f7d1c3b5a90",
"object": "task",
"model": "flux-3-klein",
"state": "queued",
"user": "user-123",
"price_usd": 0.01,
"outputs": [],
"error": null,
"meta": {},
"created_at": "2026-10-20T06:31:00.000Z",
"started_at": null,
"finished_at": null
}Next: tasks and webhooks, errors and the API reference.