FLUX 3 Image Edit transforms and combines up to 10 input images using natural-language instructions, with flexible 1K / 2K / 4K output for multi-image composition, visual refinements, creative edits, marketing assets, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle

$0.05per run·~20 / $1

Redesign only the perfume bottle she is holding. Change it to deep emerald-green translucent glass with a brushed gold cap. Replace the label text with “NOCTURNE” in elegant gold lettering. Keep the bottle's original shape, size, position, and orientation. Preserve the woman's exact face, expression, hairstyle, clothing, jewelry, pose, and finger placement. Keep the background and composition unchanged. Update reflections and the subtle light transmitted through the glass to match the new materials.
FLUX 3 Image Edit transforms and combines existing images using natural-language instructions. Provide between 1 and 10 input images, explain the role of each reference in the prompt, and generate a new composition at up to 4K resolution.
Use it for subject-guided edits, product compositions, style changes, typography, advertising creatives, and multi-reference workflows where elements from several images need to be combined into one result.
Multi-image editing
Combine up to 10 input images in a single generation.
Reference-guided composition
Assign different roles to each image, such as taking a subject from one reference and placing it into the scene from another.
Up to 4K output
Choose 1K, 2K, or 4K depending on your quality and production requirements.
Typography and layout control
Describe exact text, placement, hierarchy, and composition directly in the prompt.
Flexible aspect ratios
Choose from a wide range of landscape, portrait, square, and ultrawide layouts.
Prompt expansion
Enable automatic prompt expansion when additional interpretation is useful.
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text instructions describing the edit or new composition. Refer to input images by their order, such as image 1, image 2, and so on. Must not be empty. |
| images | Yes | Between 1 and 10 input image URLs or data URIs. Each image must be at least 256 pixels per dimension and no larger than 4 megapixels. Input order matters. |
| aspect_ratio | No | Output aspect ratio: 21:9, 2:1, 16:9, 3:2, 7:5, 4:3, 5:4, 1:1, 4:5, 3:4, 5:7, 2:3, 9:16, or 1:2. Leave empty to follow the first input image's aspect ratio. |
| resolution | No | Output resolution tier: 1k, 2k, or 4k. Default: 1k. |
| enable_prompt_expansion | No | Expand the prompt while preserving the intended content. Default: false. |
| output_format | No | Output image format: jpeg or png. Default: jpeg. |
1 and 10 images in the order you want to reference them.1k, 2k, or 4k.jpeg or png.Pricing is based only on the selected resolution.
| Resolution | Price per Image |
|---|---|
| 1K | $0.05 |
| 2K | $0.12 |
| 4K | $0.65 |
image 1, image 2, and so on.1k for lower-cost iteration before moving to 2k or 4k.png when you want to avoid additional JPEG compression.Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/black-forest-labs/flux-3/edit with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Flux 3 Edit below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"images": [
"https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
],
"aspect_ratio": "21:9",
"resolution": "1k",
"output_format": "jpeg",
"enable_prompt_expansion": false
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/black-forest-labs/flux-3/edit" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
-H "Authorization: Bearer $WAVESPEED_API_KEY")
RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
case "$STATUS" in
completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/black-forest-labs/flux-3/edit";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"images": [
"https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
],
"aspect_ratio": "21:9",
"resolution": "1k",
"output_format": "jpeg",
"enable_prompt_expansion": false
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout", "deleted"].includes(result.status)) throw new Error(JSON.stringify(result));
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"images": [
"https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
],
"aspect_ratio": "21:9",
"resolution": "1k",
"output_format": "jpeg",
"enable_prompt_expansion": False
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/black-forest-labs/flux-3/edit", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout", "deleted"}:
raise RuntimeError(result)
time.sleep(2)Flux 3 Edit is a Black Forest Labs model for image editing, exposed as a REST API on WaveSpeedAI. FLUX 3 Image Edit transforms and combines up to 10 input images using natural-language instructions, with flexible 1K / 2K / 4K output for multi-image composition, visual refinements, creative edits, marketing assets, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates Python, JavaScript, and cURL examples for submitting requests and polling results. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/black-forest-labs/black-forest-labs-flux-3-edit.
Flux 3 Edit starts at $0.05 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `images`, `aspect_ratio`, `resolution`, `enable_prompt_expansion`, `output_format`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/black-forest-labs/black-forest-labs-flux-3-edit.
Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.
Commercial usage rights depend on the model's license, set by its provider (Black Forest Labs). Check the provider's applicable terms and WaveSpeedAI's Terms of Service before commercial use.