Qwen Image 2.1, released by Alibaba in September 2026, is built for combining several pictures into one. Give it a product, a room and a prop, say what goes where, and it composes the scene. You can write the prompt in your own language, which matters if your team does not brief in English.
What you can make
- Packshots that drop your product into a new setting.
- Images briefed in Polish, Spanish, Japanese or any other language.
- A set of variants you can reproduce later by reusing the same
seed. - Composites that merge up to ten source images.
Settings that matter
- References: up to 10 images. Accepted files are JPEG, PNG and WebP, with limits of 30 MB and 25 megapixels per file.
- Resolution: 1K or 2K. 2K holds four times as many pixels.
- Aspect ratio:
autoonly works when you sendimage_urls; without references the default is 1:1. - Prompt: 1 to 5,000 characters, any language.
- Seed: fix it when you want to rerun a result with small prompt changes.
- Not available yet: Alibaba can return transparent PNGs and do mask-based inpainting with this model; neither option is switched on in Kadraris.
Starter prompt
Image 1 is the backpack, image 2 is the mountain trail. Place the backpack on a rock beside the trail at golden hour, keep the logo and stitching unchangedChange the two roles to your own references; naming what must stay unchanged keeps the product accurate.
Questions
What does Qwen Image 2.1 cost per picture?
from $0.05 per image. You see the amount before sending, and a run that fails costs you nothing.
Can I get a PNG with a transparent background?
Not yet. The model supports it, but the option is not exposed in Kadraris, so images arrive with a normal background.
How is it different from Qwen Image 2?
Qwen Image 2 edits a single source image and is known for clean lettering. Version 2.1 takes up to 10 references for composites.
Qwen Image 2.1 in your code
curl https://kadraris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $KADRARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-image-2.1",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "1K"
}
}'import os, time, requests
API = "https://kadraris.com/v1"
H = {"Authorization": f"Bearer {os.environ['KADRARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "qwen-image-2.1",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "1K"
}
}).json()
while task["status"] in ("queued", "running"):
time.sleep(3)
task = requests.get(f"{API}/tasks/{task['id']}", headers=H).json()
print(task["status"], task["cost"], [o["url"] for o in task["output"]])const API = "https://kadraris.com/v1";
const headers = { Authorization: `Bearer ${process.env.KADRARIS_API_KEY}`, "Content-Type": "application/json" };
let task = await (await fetch(`${API}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
"model": "qwen-image-2.1",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "1:1",
"resolution": "1K"
}
}),
})).json();
while (task.status === "queued" || task.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
task = await (await fetch(`${API}/tasks/${task.id}`, { headers })).json();
}
console.log(task.status, task.cost, task.output.map((o) => o.url));
Input fields
| Parameter | Type | Allowed | Default |
|---|---|---|---|
prompt * | string | ≤ 5000 chars | |
aspect_ratio | string | auto 1:1 4:3 3:4 3:2 2:3 16:9 9:16 21:9 9:21 | 1:1 |
resolution | string | 1K 2K | 1K |
image_urls | array | max 10 | |
seed | integer |
Fetch this list as JSON with GET /v1/models/qwen-image-2.1.























