# Qwen Image 2.1 Text to Image Qwen Image 2.1 generates images from text prompts with adjustable dimensions and styles. Create illustrations and visual concepts in PNG, JPEG, or WebP. ## API Information - **Model Slug:** alibaba-qwen-image-2-1-text-to-image - **Branded URL:** https://www.eachlabs.ai/alibaba/qwen/alibaba-qwen-image-2-1-text-to-image - **Provider:** Alibaba - **Category:** Text to Image - **Output Type:** array - **Status:** active - **Base Cost:** $0.02 per megapixel per image - **Interactive Demo:** https://www.eachlabs.ai/ai-models/alibaba-qwen-image-2-1-text-to-image ## Pricing - **Charge Type:** dynamic - **Estimate:** $0.02 per megapixel per image - **Pricing Details:** per output megapixel, rounded up per image: $0.02 ## Input Schema | Parameter | Type | Required | Default | Constraints | Description | |-----------|------|----------|---------|-------------|-------------| | prompt | string | Yes | - | - | The prompt describing the image to generate. | | image_size | string | No | square_hd | square_hd, square, portrait_4_3, portrait_16_9, landscape_4_3, landscape_16_9, custom | Output size, rounded to multiples of 32 pixels. | | guidance_scale | number | No | 1 | 1–10 | Classifier-free guidance strength. The model defaults to no guidance. | | num_images | integer | No | 1 | 1–4 | Number of images to generate sequentially.1-4 | | output_format | string | No | png | png, jpeg, webp | Output format. PNG and WebP preserve transparency; JPEG uses white. | | negative_prompt | string | No | - | - | Content to avoid; used only when guidance_scale is greater than 1. | | seed | integer | No | - | - | Seed for reproducibility. | | enable_safety_checker | boolean | No | true | - | Whether to check generated images for unsafe content. | ## Example Request ```bash curl -X POST https://api.eachlabs.ai/v1/prediction/ \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "alibaba-qwen-image-2-1-text-to-image", "input": { "prompt": "Photorealistic beauty product editorial photograph. A young woman with luminous dewy skin and natural freckles holds a serum bottle up beside her face, the bottle positioned in the lower left foreground and slightly closer to camera than her face, held between her thumb and fingers with the label facing forward. Her head is tilted, chin slightly lowered, looking directly into the lens with a calm confident expression, lips softly closed. Dark hair pulled back tightly, a few loose strands falling across her forehead. Small gold hoop earrings, a plain ribbed cream tank top, simple silver rings on her fingers.\n\nThe product is a matte frosted glass dropper bottle in deep burgundy with a matching burgundy cap and a white dropper tip, 30 ml, with a clean unbranded label — no text, no logo, no lettering of any kind on the bottle.\n\nWarm beige seamless studio backdrop, soft diffused light from the upper left with a gentle falloff and a subtle shadow behind her shoulder. Shallow depth of field with the bottle and her face both in sharp focus. Vertical portrait orientation, natural skin texture visible, glossy highlights on the cheekbones and lips, warm neutral colour grading, high-end skincare campaign quality." } }' ``` ## Output Schema Response returned by `GET /v1/prediction/{id}` when the job completes: ```json { "status": "success", "predictionID": "string", "output": "array", "metrics": { "predict_time": "number (seconds)" } } ``` ## Polling ```bash curl https://api.eachlabs.ai/v1/prediction/{PREDICTION_ID} \ -H "Authorization: Bearer YOUR_API_KEY" ``` | Status | Meaning | |--------|---------| | `processing` | Still running — poll again | | `success` | Done — read `output` | | `error` | Failed — read `message` / `details` | ## Webhook (alternative to polling) Pass `"webhook_url": "https://your.host/path"` in the create request. Eachlabs POSTs this payload when the job ends: ```json { "exec_id": "prediction-uuid", "status": "succeeded", "output": "https://...", "error": "" } ``` `status` is `"succeeded"` or `"failed"`. `exec_id` equals the `predictionID` from create. Return 2xx within 30 seconds. ## Errors Error body: `{ "status": "error", "message": "...", "details": "..." }` | Code | Meaning | |------|---------| | `400` | Invalid input | | `401` | Missing / invalid `Authorization` bearer token | | `404` | Unknown model or prediction id | | `429` | Rate limit — 100 creates / min, 10 concurrent per key | | `5xx` | Retry with backoff | ## Usage Notes - API Base URL: `https://api.eachlabs.ai/v1` - Authentication: send `Authorization: Bearer YOUR_API_KEY`. Generate a key from the Eachlabs dashboard at https://www.eachlabs.ai/dashboard/api-keys. - File-typed parameters (`*_url`, `image_url`, `video_url`, `audio_url`, etc.) accept publicly-reachable HTTPS URLs only. Upload your asset first (GCS / S3 / your CDN) and pass the resulting URL. Data-URIs and localhost URLs are rejected. - For structured parameters (arrays / objects) send real JSON values, not stringified payloads. - Monetary values are reported in USD; per-token / per-megapixel rates may be billed in micro-cents internally. - Prefer `webhook_url` over polling for long-running predictions — see the Webhook Callback section.