Flux 2 Klein Base 9b Edit API Documentation

Flux 2 Klein Base 9b Edit API Documentation

Playground

Try it on WaveSpeedAI!

FLUX.2 [klein] Base 9B Edit is a high-quality image editing model with 9B parameters, offering precise modifications using natural language instructions. Ready-to-use REST inference API, best performance, no cold starts, affordable pricing.

Features

WaveSpeed AI FLUX.2 Klein Base 9B Edit is a high-quality image editing model built for prompt-driven transformations, compositing, and style changes. Upload one or more source images, describe the edit in natural language, and generate polished results with stronger detail and better prompt understanding than the 4B variant.


Why Choose This?

  • Higher-quality editing The 9B parameter model delivers richer detail, stronger prompt adherence, and better overall edit quality than the 4B variant.

  • Natural-language editing Describe the change you want in plain language — transform style, replace elements, change mood, or combine multiple images.

  • Multi-image support Upload multiple reference images and perform compositing or cross-image edits such as “Put the person in image1 into image2.”

  • Flexible output sizing Optionally set output dimensions, or leave size empty to preserve the original input dimensions.

  • Prompt Enhancer Built-in prompt enhancement can help improve edit quality and clarity.

  • Production-ready workflow Suitable for high-quality creative editing, marketing visuals, and more complex multi-image transformations.


Parameters

ParameterRequiredDescription
promptYesText description of the desired edit.
imagesYesSource images to edit. Multiple images are supported.
sizeNoOutput dimensions. Leave empty to match the input image dimensions.
seedNoRandom seed for reproducibility. Use -1 for random generation.

How to Use

  1. Write your prompt — describe the edit you want, such as “Put the person in image1 into image2” or “Change this to watercolor style.”
  2. Upload your images — add one or more source images using the image input.
  3. Set size (optional) — specify output dimensions, or leave it empty to preserve the original dimensions.
  4. Set seed (optional) — use -1 for random generation, or enter a fixed seed for reproducible results.
  5. Submit — run the model and download the edited image.

Example Prompt

Put the person in image1 into image2, keep realistic lighting and proportions, and match the scene naturally.


Pricing

ItemCost
Per image$0.021

Billing Rules

  • Pricing is fixed at $0.021 per generated image
  • size and seed do not affect pricing
  • Flat-rate pricing applies regardless of image dimensions

Best Use Cases

  • Image compositing — Combine subjects or objects from multiple images into one result.
  • Style transfer — Transform images into different artistic or visual styles with strong fidelity.
  • Professional editing — Use the 9B model when the 4B variant is not sufficient for production-quality work.
  • Content transformation — Change lighting, mood, environment, or visual theme with more precision.
  • Complex multi-image edits — Handle edits that require stronger scene understanding and better subject consistency.

Pro Tips

  • Be specific about what should change and what should stay the same.
  • Reference input images clearly in the prompt, such as image1, image2, and so on.
  • Leave size empty when you want to preserve the original image dimensions.
  • Use the same seed when comparing different prompt variations on the same images.
  • For complex edits, describe both the main transformation and any constraints like lighting, realism, or identity preservation.

Notes

  • Both prompt and images are required.
  • If size is not specified, the output matches the input image dimensions.
  • The 9B model offers better detail and stronger prompt understanding than the 4B variant.
  • Need LoRA support? Try FLUX.2 Klein Base 9B Edit LoRA.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "prompt": "A cinematic ocean wave at sunrise, highly detailed",
  "images": [
    "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
  ],
  "seed": -1
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/flux-2-klein-base-9b/edit" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}")

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi

# 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 type == "object" and has("data") then .data else . end')
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
  esac
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes--
imagesarray<string>Yes-0 ~ 3 itemsList of reference image URLs (1-3 images).
seedintegerNo-1--
enable_sync_modebooleanNofalse-If set to `true`, the request attempts to wait for the generated result and return outputs in the same response. If the result is not ready within the sync wait window, the API can return a timeout body while the task continues processing. This option is only available via the API and is supported only by some models.
enable_base64_outputbooleanNofalse-If set to `true`, the prediction's `output` strings are returned as **naked base64** (no `data:<mime>;base64,` prefix). When `false` (default), outputs are returned as URLs pointing to our CDN.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to retrieve the prediction result
data.statusstringStatus of the task: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to poll for the prediction result
data.statusstringStatus: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.