Most image models smudge words. Qwen Image 2, which Alibaba released in February 2026, is known for the opposite: titles, bullet points and speech bubbles come out legible and in a sensible order. One model covers both new images from text and edits of a single existing picture.
What you can make
- Presentation slides and infographic panels with headings and short bullet lists.
- Comic panels where characters talk in speech bubbles.
- Posters with a clear title, subtitle and date line.
- Fixes to an existing image: replaced text, a swapped object.
Settings that matter
- Prompt length: capped at 800 characters. Spend them on the text blocks first and keep the style note short.
- Exact words: put every string that must appear in quotes.
- Aspect ratio, new images: 1:1, 3:4, 4:3, 9:16 or 16:9.
- Aspect ratio, edits: the same five plus 2:3, 3:2 and 21:9. Those three give an error outside edit mode.
- Edit mode: sending
image_urlswitches to editing, so describe the change, not the whole scene. - Seed: reuse it to reproduce a result.
Starter prompt
Flat vector poster, title "SUMMER BOOK FAIR", subtitle "Old Town Square", date "June 14-16", stack of colorful books, cream backgroundReplace the three quoted strings with your own event, keeping each one short.
Questions
How much does Qwen Image 2 charge per image?
$0.077 per image. You see the price before you press Generate, and you pay nothing if the job fails.
My layout needs more text than 800 characters. What now?
Use Qwen Image 3.0, which accepts prompts of about 4.5k tokens and handles full pages. The guide to text in AI images has more tips.
Can I combine several reference photos?
Not with this model, edits work on one source image. Qwen Image 2.1 takes up to 10 references.
Qwen Image 2 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",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "16:9"
}
}'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",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "16:9"
}
}).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",
"input": {
"prompt": "Packshot of a white linen sneaker on a concrete block, hard midday sun, crisp shadow, 85mm",
"aspect_ratio": "16:9"
}
}),
})).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 | ≤ 800 chars | |
aspect_ratio | string | 1:1 3:4 4:3 9:16 16:9 2:3 3:2 21:9 | 16:9 |
image_url | string | ||
seed | integer |
Fetch this list as JSON with GET /v1/models/qwen-image-2.























