Introduction
FLUX.1 Dev ControlNet LoRA Text to image generates images with FLUX.1 [dev], the 12-billion-parameter model from Black Forest Labs, guided by ControlNet Union Pro 2.0 from Shakker Labs, with up to three of your own LoRA files loaded. One control image fixes the pose, depth or outlines; the prompt decides who and what is in the picture. The platform adds no content filter to the prompt, the weights or the image.
Key features & highlights
One network, five kinds of map
Canny lines, soft edges, depth, pose skeletons and grayscale photos all work through the same endpoint. There is no mode switch: the model reads the map you send.
Strength and timing controls
Control strength (0 to 1) sets how firmly the map is followed, and the start and end of the control window set when it applies during denoising.
Your own LoRAs
Up to three FLUX.1 dev LoRAs load per request. An unfiltered LoRA with a pose skeleton delivered the Strong level in our tests.
Up to four images per run
Ask for one to four images from the same map, billed per image.
Request parameters
| Parameter | Required | Description |
|---|---|---|
prompt | Yes | Describe the picture you want: people, clothing, setting and light. The control image only sets the layout. at least 1 characters · at most 5000 characters |
control_image_url | Yes | The control map: a pose skeleton, a depth map, canny or soft-edge lines, or a grayscale or plain photo. It is not extracted for you. |
control_strength | No | How strongly the result follows the control map, 0 to 1; 0.7 by default. Pose maps work well around 0.9; at 0.3 our pose was ignored. |
control_guidance_start | No | The point in the denoising, 0 to 1, where the map starts to apply; 0 by default. Must not be later than the end. |
control_guidance_end | No | The point in the denoising, 0 to 1, where the map stops applying; 0.8 by default. Ending earlier, around 0.65 for pose maps, leaves the details freer. |
resolution | No | 1k returns a long side of 1,024 pixels and is the default; 1.5k returns 1,536, in the control image's aspect ratio. Both cost the same. |
num_outputs | No | How many images to generate from the same map, 1 to 4; 1 by default. Each image is billed, so four images cost four times one. |
loras | No | Up to three {path, scale} entries trained for FLUX.1 dev; scale 0 to 4, 1 is neutral. A LoRA for another model family fails the request. Default: |
guidance_scale | No | How closely the image follows the prompt, 0 to 20; 3.5 by default. Does not change the price. |
steps | No | Denoising steps, 1 to 50; 28 by default. Fewer steps return faster and a little softer. |
output_format | No | JPEG by default, or PNG or WebP. The format does not change the price. |
seed | No | Keeps results comparable while you change the strength or a LoRA. It does not guarantee the exact same pixels on every run. |
Pricing
$0.036 / image
Billed per image: a run of four images costs four times one. The resolution tier, the output format and loading LoRAs do not change the price.
Use cases
Matching a pose
Extract or draw a skeleton once and render the same pose with any person and outfit.
Restaging a photograph
Keep a photo's composition through its canny, soft-edge or grayscale map and change the cast, wardrobe and light.
Series with one layout
Reuse a control map so every image in a set shares the same framing.
Prompt guide & pro tips
Choose the map by what should change
A pose skeleton leaves clothing to the prompt. Depth and line maps keep the folds of the clothes in the photo they were traced from, and in our tests the model followed those folds instead of the prompt.
Start from the suggested settings
Shakker Labs suggests strength 0.7 with the window ending at 0.8 for canny and soft edge, 0.8 for depth, and about 0.9 with the window ending at 0.65 for pose maps.
Match the aspect ratio
The output takes the shape of the control image. Crop the map to the frame you want before you send it.
Check the LoRA base model
Only FLUX.1 dev LoRAs work. A LoRA for another model family fails the request rather than being ignored.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "black-forest-labs/flux-1-dev-controlnet-lora/text-to-image",
"input": {
"control_image_url": "https://example.com/reference.png",
"num_outputs": 1,
"output_format": "jpeg",
"prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
"resolution": "1k"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.
























