Krea V3 Image Edit edits and combines up to eight reference images with natural-language instructions, supporting quality and speed variants, custom dimensions, seed control, multi-image composition, creative edits, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle
/filters:quality(85)/examples/dcab15e6170737109981665db231e229/c90815fa-a511-45fd-b7a5-0e986aa16771-9c4cbb2e4a54.webp)
$0.03per run·~33 / $1
/filters:quality(82)/examples/dcab15e6170737109981665db231e229/c90815fa-a511-45fd-b7a5-0e986aa16771-9c4cbb2e4a54.webp)
Transform the inside of the cocktail glass into a tiny Mediterranean coastline with miniature cliffs, turquoise water, a small white villa, and one tiny sailboat. Keep the liquid surface, refraction, glass transparency, and garnish physically realistic. Preserve the bartender’s exact identity, pose, clothing, glass shape, bar environment, and composition. Luxury surreal product photography, detailed miniature world, elegant cinematic lighting.
/filters:quality(82)/examples/75ea083e76269df3e6c3ca9339f63e0c/e02dba7d-449d-422b-9737-c8305b1d9b20-427d1a5739be.webp)
Transform the botanical tattoo on the client’s forearm into an intricate raised metallic relief made of brushed silver and antique gold, following the exact original tattoo pattern. Add fine engraved leaves, tiny ornamental details, and realistic highlights while keeping the skin and surrounding scene unchanged. Preserve the tattoo artist, client, poses, hands, studio layout, and camera angle. Photorealistic material transformation, refined craftsmanship, highly detailed.
Krea V3 Edit edits and combines up to 8 reference images using natural-language instructions. Use berry for quality-focused editing or jam for faster results, and optionally set custom output dimensions for your target composition.
Multi-image editing
Edit or combine up to 8 reference images in one request.
Reference-aware prompting
Refer to inputs as <image-1>, <image-2>, and so on to describe how each image should be used.
Two generation variants
Use berry for quality or jam for faster generation.
Custom output dimensions
Set the output width and height when a specific layout is required.
Negative prompt support
Use negative_prompt with Berry to reduce unwanted elements.
Seed control
Use a fixed seed for more reproducible editing workflows.
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Describe the desired edit. Refer to input images as <image-1>, <image-2>, and so on. |
| images | Yes | Between 1 and 8 reference image URLs, ordered according to their prompt references. |
| model | No | berry for quality-focused generation or jam for faster generation. Default: berry. |
| negative_prompt | No | Optional content to avoid. Used only by berry. |
| size | No | Optional output dimensions in width*height format. Omit to let the model choose the output size automatically. |
| reasoning_level | No | low or medium. Default: low. |
| output_format | No | png or jpeg. Default: png. |
| seed | No | Optional integer seed for reproducible generation. |
1 and 8 images.<image-1>, <image-2>, and so on.berry or jam.size empty for automatic sizing.Pricing is based on the output image size and the number of reference images.
The rate is $0.03 per megapixel for the output image and for each supplied reference image.
| Output Size | Reference Images | Price |
|---|---|---|
| 1024 × 1024 | 1 | $0.06 |
| 1024 × 1024 | 3 | $0.12 |
| 2048 × 2048 | 1 | $0.24 |
| 2048 × 2048 | 8 | $1.08 |
berry and jam use the same pricing. negative_prompt, reasoning_level, output_format, and seed do not add separate charges.
<image-1>, <image-2>, and so on.berry when image quality is the priority.jam when faster iteration is preferred.negative_prompt only with Berry.seed when comparing prompt or reference changes.prompt and images are required.images supports between 1 and 8 references.model defaults to berry.size is optional; when omitted, the model selects the output dimensions automatically.256 to 4096 pixels per side, subject to the maximum output pixel limit.negative_prompt applies only to Berry.Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/krea/v3/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 v3 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"
],
"reasoning_level": "low",
"model": "berry",
"output_format": "png"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/krea/v3/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/krea/v3/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"
],
"reasoning_level": "low",
"model": "berry",
"output_format": "png"
}),
});
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"
],
"reasoning_level": "low",
"model": "berry",
"output_format": "png"
}
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/krea/v3/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)v3 Edit is a Krea model for image editing, exposed as a REST API on WaveSpeedAI. Krea V3 Image Edit edits and combines up to eight reference images with natural-language instructions, supporting quality and speed variants, custom dimensions, seed control, multi-image composition, creative edits, 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/krea/krea-v3-edit.
v3 Edit starts at $0.03 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`, `seed`, `negative_prompt`, `model`, `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/krea/krea-v3-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 (Krea). Check the provider's applicable terms and WaveSpeedAI's Terms of Service before commercial use.