Skip to content

Wan2.6 - image generation and editing

The Wan2.6 image generation and editing model supports multi-image input, image editing, and interleaved text-image output.

Model overview

ModelDescriptionOutput image specifications
wan2.6-imageEdits images and generates interleaved text-image output.Image format: PNG For image resolution and dimensions, see the size parameter .

Note

Before calling the API, check the model list and pricing supported in each region.

Prerequisites

Create an API key and export the API key as an environment variable. Important

The Singapore, Virginia, and Beijing regions have separate API keys and request endpoints . They cannot be used interchangeably. Cross-region calls lead to authentication failures or service errors. For more information, see Select a region and service deployment scope.

HTTP synchronous

Returns results in a single request. Recommended for most scenarios.

Singapore

POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

Virginia

POST https://dashscope-us.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

Beijing

POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

The global deployment scope (Frankfurt region) only supports asynchronous calls .

Request parameters

## Image editing

curl
curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \\
 --header 'Content-Type: application/json' \\
 --header "Authorization: Bearer $DASHSCOPE_API_KEY" \\
 --data '{
 "model": "wan2.6-image",
 "input": {
 "messages": \[
 {
 "role": "user",
 "content": \[
 {
 "text": "Generate a tomato and egg stir-fry based on the style of image 1 and the background of image 2"
 },
 {
 "image": "https://cdn.wanx.aliyuncs.com/tmp/pressure/umbrella1.png"
 },
 {
 "image": "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"
 }
 \]
 }
 \]
 },
 "parameters": {
 "prompt_extend": true,
 "watermark": false,
 "n": 1,
 "enable_interleave": false,
 "size": "1K"
 }
 }'

## Interleaved text-image output (streaming only)

When using interleaved text-image output (parameters.enable_interleave = true) with the synchronous interface, streaming is required. Set both conditions:

  • Set X-DashScope-SSE to enable.
  • Set parameters.stream to true.
curl
curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \\
 --header 'Content-Type: application/json' \\
 --header "Authorization: Bearer $DASHSCOPE_API_KEY" \\
 --header 'X-DashScope-SSE: enable' \\
 --data '{
 "model": "wan2.6-image",
 "input": {
 "messages": \[
 {
 "role": "user",
 "content": \[
 {
 "text": "Give me a three-image tutorial for stir-fried pork with chili peppers"
 }
 \]
 }
 \]
 },
 "parameters": {
 "max_images": 3,
 "size": "1280*1280",
 "stream": true,
 "enable_interleave":true
 }
 }'
Request headers

Content-Type *string* (Required) The content type of the request. Must be application/json.

Authorization *string* (Required) Authenticates the request with a Model Studio API key. Example: Bearer sk-xxxx.

**X-DashScope-SSE ***string* (Optional) Enables streaming output.

  • When parameters.enable_interleave=true, set to **enable**.
  • In other cases, omit this header.
Request body

model *string* (Required) Model name. Set to wan2.6-image.

input *object* (Required) Basic input information. Properties

messages *array* (Required) Request content array. Only single-turn conversations are supported -- provide one role-content pair. Properties

**role ***string* (Required) Message role. Set this parameter to user.

**content ***array* (Required) Array of message content. Properties

text *string* (Required) Positive prompt describing the desired image content, style, and composition. Supports Chinese and English. Maximum is 2,000 characters (each Chinese character, letter, digit, or symbol counts as one). Content is auto-truncated if exceeded. Example: Generate a tomato and egg stir-fry based on this image style. Note: The content array must contain exactly one object with a text field.

**image *string* **(Optional) URL or Base64-encoded string of the input image. Image constraints:

  • Image formats: JPEG, JPG, PNG (alpha channel not supported), BMP, WebP.

  • Image resolution: Width and height must each be between 240 and 8,000 pixels.

  • File size: Must not exceed 10 MB. Image quantity limits:

  • The number of input images depends on the parameters.enable_interleave parameter. <li> When enable_interleave=true (interleaved text-image output), you can input 0 to 1 images.

  • When enable_interleave=false (image editing), you must input 1 to 4 images. </li>

  • When you input multiple images, include multiple image objects in the content array, defining the image order by array sequence. Supported input formats:

  • Use a publicly accessible URL <li> Supports HTTP or HTTPS protocols.

  • Example: http://wanx.alicdn.com/material/xxx.jpeg. </li>

  • Provide a Base64-encoded image string <li> Format: data:{MIME_type};base64,

  • Example: data:image/jpeg;base64,GDU7MtCZzEbTbmRZ... (for illustration only; provide the complete string in practice)

  • For Base64 encoding guidelines, see Image input methods. </li>

parameters *object* (Optional) Image processing parameters. Properties

negative_prompt *string* (optional) A negative prompt describing what you do not want in the image. Supports Chinese and English. Maximum length is 500 characters. Excess characters are truncated automatically. Example: Low resolution, low quality, distorted limbs, malformed fingers, oversaturated colors, wax-like appearance, no facial details, overly smooth surfaces, AI-generated look. Chaotic composition. Blurry or distorted text.

size *string* (Optional) Output image resolution. Supports two methods: referencing input image proportions or directly specifying dimensions. When enable_interleave=false (image editing mode):

  • Method 1: Reference input image proportions (recommended) Available output resolution options: 1K (default), 2K. <li> 1K: Output total pixels close to 1280*1280, maintaining the aspect ratio of the last input image.

  • 2K: Output total pixels close to 2048*2048, maintaining the aspect ratio of the last input image. </li>

  • Method 2: Specify output image width and height in pixels Total pixels must be between [768768, 20482048], with an aspect ratio range of [1:4, 4:1]. ** Actual output pixel values are multiples of 16 closest to the specified value. When enable_interleave=true (interleaved text-image output mode):

  • Method 1: Reference input image proportions (default method) <li> If total input image pixels ≤ 1280*1280, output matches the input's total pixels and aspect ratio.

  • If total input image pixels > 12801280, output total pixels are close to 12801280, maintaining the input's aspect ratio.

  • If no input image is provided, the output size is 1280*1280. </li>

  • Method 2: Specify output image width and height in pixels Total pixels must be between [768768, 12801280], with an aspect ratio range of [1:4, 4:1]. Actual output pixel values are multiples of 16 closest to the specified value.

<b>Recommended resolutions for common aspect ratios**

  • 1:1: 1280*1280
  • 2:3: 800*1200
  • 3:2: 1200*800
  • 3:4: 960*1280
  • 4:3: 1280*960
  • 9:16: 720*1280
  • 16:9: 1280*720
  • 21:9: 1344*576

enable_interleave *bool* (Optional) Controls image generation mode:

  • false (default): Indicates image editing mode (supports multi-image input and subject consistency generation). <li> Use case: Edit, apply style transfer, or generate subject-consistent images based on 1 to 4 input images.
  • Input: Must provide at least one reference image.
  • Output: Can generate 1 to 4 result images. </li>
  • true: Enables interleaved text-image output mode (supports inputting one image or no image). <li> Use case: Generate content combining text and images based on a text description, or perform pure text-to-image generation.
  • Input: Can provide no image (text-to-image) or up to one reference image.
  • Output: Generates mixed content containing both text and images. </li>

n *integer* (Optional)

**

**Important ** This parameter affects cost (charged per successful image -- see pricing).

Specifies the number of images to generate. Behavior depends on enable_interleave:

  • When enable_interleave=false (image editing mode): <li> Function: Directly controls the number of generated images.
  • Range: 1 to 4. Default value is 4.
  • During testing, set this value to 1 for low-cost validation. </li>
  • When enable_interleave=true (interleaved text-image mode): <li> Restriction: This parameter defaults to 1 and must remain 1. Setting any other value causes an error.
  • In this mode, use the max_images parameter to control the maximum number of generated images. </li>

max_images *integer* (Optional)

**

**Important ** This parameter affects cost (charged per successful image -- see pricing).

Only effective in interleaved text-image mode (enable_interleave=true).

  • Function: Specifies the maximum number of images the model can generate in a single response.
  • Range: 1 to 5. Default value is 5.
  • This parameter sets the maximum image count. Model may generate fewer (e.g., request 5, get 3).

prompt_extend *bool* (Optional) Only effective in image editing mode (enable_interleave = false). This parameter enables intelligent prompt rewriting (optimizes positive prompt only, leaves negative prompt unchanged).

  • true (default)
  • false

stream *bool* (Optional) This parameter enables streaming output. Required (set to true) when enable_interleave=true.

  • false (default)
  • true

watermark *bool* (Optional) Adds a watermark label in the bottom-right corner of the image with fixed text "AI Generated".

  • false (default)
  • true

seed *integer* (optional) Random number seed. Valid range: \[0,2147483647\]. Using the same seed yields similar outputs. If omitted, the algorithm uses a random seed. Note: Image generation is probabilistic. Even with the same seed, results may vary.

Response parameters

## Successful task execution

Task data (task status and image URLs) is retained for only 24 hours and then automatically purged. Save generated images promptly.

json
{
 "output": {
 "choices": \[
 {
 "finish_reason": "stop",
 "message": {
 "content": \[
 {
 "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxx.png?Expires=xxx",
 "type": "image"
 }
 \],
 "role": "assistant"
 }
 }
 \],
 "finished": true
 },
 "usage": {
 "image_count": 1,
 "input_tokens": 0,
 "output_tokens": 0,
 "size": "1376*768",
 "total_tokens": 0
 },
 "request_id": "a3f4befe-cacd-49c9-8298-xxxxxx"
}

## Successful task execution (streaming output)

Task data (task status and image URLs) is retained for only 24 hours and then automatically purged. Save generated images promptly.

json
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"meat"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":571,"image_count":3,"output_tokens":543,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"fragrant"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":572,"image_count":3,"output_tokens":544,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"intertwine"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":573,"image_count":3,"output_tokens":545,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
......
{"output":{"choices":\[{"message":{"content":\[{"type":"image","image":"https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxx.png?Expires=xxxx"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":557,"image_count":3,"output_tokens":529,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"while"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":558,"image_count":3,"output_tokens":530,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"hot"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":559,"image_count":3,"output_tokens":531,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"pinch"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":560,"image_count":3,"output_tokens":532,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"up"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":561,"image_count":3,"output_tokens":533,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"a piece of"}\],"role":"assistant"},"finish_reason":"null"}\],"finished":true},"usage":{"total_tokens":562,"image_count":3,"output_tokens":534,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}
{"output":{"choices":\[{"message":{"content":\[{"type":"text","text":"meat"}\],"role":"assistant"},"finish_reason":"stop"}\],"finished":true},"usage":{"total_tokens":563,"image_count":3,"output_tokens":535,"size":"1280*1280","input_tokens":28},"request_id":"d2dcb952-bf91-4a6a-aad5-xxxxxx"}

## Task execution failure

If the task fails, error information is returned. Use the code and message fields to identify the cause. See Error messages for troubleshooting.

json
{
 "request_id": "a4d78a5f-655f-9639-8437-xxxxxx",
 "code": "InvalidParameter",
 "message": "num_images_per_prompt must be 1"
}
     **output** `*object*`  Task output information.

Propertieschoices *array of object * Model-generated output content. Properties

finish_reason&nbsp;*string* Reason for task termination. Non-streaming output scenario: Naturally stops with stop. Streaming output scenario: This parameter indicates whether the data stream has finished transmitting.

  • During transmission: Previous data packets continuously return "finish_reason": "null", indicating content is still being generated. Continue receiving.
  • At transmission end: Only the last JSON structure returns "finish_reason":"stop", indicating the streaming request has fully completed. Stop receiving.

message *object* Message returned by the model. Properties

**role ***string* Message role, fixed as assistant.

**content ***array*Properties

type *string* Output type. Enumerated values: text, image.

text *string* Generated text.

image *string* URL of the generated image in PNG format. Link expires after 24 hours. Download and save the image promptly.

finished *bool* Request completion flag.

  • true
  • false

usage *object* Output statistics. Counts only successful results. Properties

image_count *integer* Number of generated images.

size *string* Resolution of generated images. Example: 1376*768.

input_tokens *integer* Billed per image count.

  • In image editing mode, fixed at 0.
  • In interleaved text-image mode, this field counts input text tokens (not billed).

output_tokens *integer* Billed per image count.

  • In image editing mode, fixed at 0.
  • In interleaved text-image mode, this field counts output text tokens (not billed).

**total_tokens ***integer* Billed per image count.

  • In image editing mode, fixed at 0.
  • In interleaved text-image mode, this field counts total tokens (not billed).

request_id *string* Unique request identifier for tracing and troubleshooting.

code *string* Error code. Returned only for failed requests. See Error messages.

message *string* Detailed error message. Returned only for failed requests. See Error messages.

HTTP asynchronous

Process: Create task → Poll results

Step 1: Create task and get task ID

Singapore

POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/image-generation/generation

Virginia

POST https://dashscope-us.aliyuncs.com/api/v1/services/aigc/image-generation/generation

Beijing

POST https://dashscope.aliyuncs.com/api/v1/services/aigc/image-generation/generation

Frankfurt

POST https://++<u>{WorkspaceId}.eu-central-1.maas.aliyuncs.com</u>++/api/v1/services/aigc/image-generation/generation

When you make a call, replace WorkspaceId with your Workspace ID. Note

  • After the task is created, use the returned task_id to query the result. The task_id is valid for 24 hours. Do not create duplicate tasks. Instead, use polling to retrieve the result.

  • For guidance for beginners, see Postman.

Request parameters

## Image editing

curl
curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/image-generation/generation' \\
 --header 'Content-Type: application/json' \\
 --header "Authorization: Bearer $DASHSCOPE_API_KEY" \\
 --header 'X-DashScope-Async: enable' \\
 --data '{
 "model": "wan2.6-image",
 "input": {
 "messages": \[
 {
 "role": "user",
 "content": \[
 {
 "text": "Generate a tomato and egg stir-fry based on the style of image 1 and the background of image 2"
 },
 {
 "image": "https://cdn.wanx.aliyuncs.com/tmp/pressure/umbrella1.png"
 },
 {
 "image": "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"
 }
 \]
 }
 \]
 },
 "parameters": {
 "prompt_extend": true,
 "watermark": false,
 "n": 1,
 "enable_interleave": false,
 "size": "1K"
 }
 }'

## Interleaved text-image output

curl
curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/image-generation/generation' \\
 --header 'Content-Type: application/json' \\
 --header "Authorization: Bearer $DASHSCOPE_API_KEY" \\
 --header 'X-DashScope-Async: enable' \\
 --data '{
 "model": "wan2.6-image",
 "input": {
 "messages": \[
 {
 "role": "user",
 "content": \[
 {
 "text": "Give me a three-image tutorial for stir-fried pork with chili peppers"
 }
 \]
 }
 \]
 },
 "parameters": {
 "max_images": 3,
 "size": "1280*1280",
 "enable_interleave":true
 }
 }'
Request headers

Content-Type *string* (Required) The content type of the request. Must be application/json.

Authorization *string* (Required) Authenticates the request with a Model Studio API key. Example: Bearer sk-xxxx. **X-DashScope-Async **string* *(Required) Asynchronous processing configuration parameter. Must be set to **enable**.

**

**Important ** Omitting this header returns the error: "current user api does not support synchronous calls".

Request body

model *string* (Required) Model name. Example: wan2.6-image

input *object* (Required) Basic input information. Properties

messages *array* (Required) Array of request content. Currently, only single-turn conversations are supported. Provide one set of role and content parameters. Multi-turn conversations are not supported. Properties

**role ***string* (Required) Message role. Set this parameter to user.

**content ***array* (Required) Array of message content. Properties

text *string* (Required) Positive prompt describing the desired image content, style, and composition. Supports Chinese and English. Maximum is 2,000 characters (each Chinese character, letter, digit, or symbol counts as one). Content is auto-truncated if exceeded. Example: Generate a tomato and egg stir-fry based on this image style. Note: The content array must contain exactly one object with a text field.

**image *string* **(Optional) URL or Base64-encoded string of the input image. Image constraints:

  • Image formats: JPEG, JPG, PNG (alpha channel not supported), BMP, WebP.

  • Image resolution: Width and height must each be between 240 and 8,000 pixels.

  • File size: Must not exceed 10 MB. Image quantity limits:

  • The number of input images depends on the parameters.enable_interleave parameter. <li> When enable_interleave=true (interleaved text-image output), you can input 0 to 1 images.

  • When enable_interleave=false (image editing), you must input 1 to 4 images. </li>

  • When you input multiple images, include multiple image objects in the content array, defining the image order by array sequence. Supported input formats:

  • Use a publicly accessible URL <li> Supports HTTP or HTTPS protocols.

  • Example: http://wanx.alicdn.com/material/xxx.jpeg. </li>

  • Provide a Base64-encoded image string <li> Format: data:{MIME_type};base64,

  • Example: data:image/jpeg;base64,GDU7MtCZzEbTbmRZ... (for illustration only; provide the complete string in practice)

  • For Base64 encoding guidelines, see Image input methods. </li>

parameters *object* (Optional) Image processing parameters. Properties

negative_prompt *string* (optional) A negative prompt describing what you do not want in the image. Supports Chinese and English. Maximum length is 500 characters. Excess characters are truncated automatically. Example: Low resolution, low quality, distorted limbs, malformed fingers, oversaturated colors, wax-like appearance, no facial details, overly smooth surfaces, AI-generated look. Chaotic composition. Blurry or distorted text.

size *string* (Optional) Output image resolution. Supports two methods: referencing input image proportions or directly specifying dimensions. When enable_interleave=false (image editing mode):

  • Method 1: Reference input image proportions (recommended) Available output resolution options: 1K (default), 2K. <li> 1K: Output total pixels close to 1280*1280, maintaining the aspect ratio of the last input image.

  • 2K: Output total pixels close to 2048*2048, maintaining the aspect ratio of the last input image. </li>

  • Method 2: Specify output image width and height in pixels Total pixels must be between [768768, 20482048], with an aspect ratio range of [1:4, 4:1]. ** Actual output pixel values are multiples of 16 closest to the specified value. When enable_interleave=true (interleaved text-image output mode):

  • Method 1: Reference input image proportions (default method) <li> If total input image pixels ≤ 1280*1280, output matches the input's total pixels and aspect ratio.

  • If total input image pixels > 12801280, output total pixels are close to 12801280, maintaining the input's aspect ratio.

  • If no input image is provided, the output size is 1280*1280. </li>

  • Method 2: Specify output image width and height in pixels Total pixels must be between [768768, 12801280], with an aspect ratio range of [1:4, 4:1]. Actual output pixel values are multiples of 16 closest to the specified value.

<b>Recommended resolutions for common aspect ratios**

  • 1:1: 1280*1280
  • 2:3: 800*1200
  • 3:2: 1200*800
  • 3:4: 960*1280
  • 4:3: 1280*960
  • 9:16: 720*1280
  • 16:9: 1280*720
  • 21:9: 1344*576

enable_interleave *bool* (Optional) Controls image generation mode:

  • false (default): Indicates image editing mode (supports multi-image input and subject consistency generation). <li> Use case: Edit, apply style transfer, or generate subject-consistent images based on 1 to 4 input images.
  • Input: Must provide at least one reference image.
  • Output: Can generate 1 to 4 result images. </li>
  • true: Enables interleaved text-image output mode (supports inputting one image or no image). <li> Use case: Generate content combining text and images based on a text description, or perform pure text-to-image generation.
  • Input: Can provide no image (text-to-image) or up to one reference image.
  • Output: Generates mixed content containing both text and images. </li>

n *integer* (Optional)

**

**Important ** This parameter affects cost (charged per successful image -- see pricing).

Specifies the number of images to generate. Behavior depends on enable_interleave:

  • When enable_interleave=false (image editing mode): <li> Function: Directly controls the number of generated images.
  • Range: 1 to 4. Default value is 4.
  • During testing, set this value to 1 for low-cost validation. </li>
  • When enable_interleave=true (interleaved text-image mode): <li> Restriction: This parameter defaults to 1 and must remain 1. Setting any other value causes an error.
  • In this mode, use the max_images parameter to control the maximum number of generated images. </li>

max_images *integer* (Optional)

**

**Important ** This parameter affects cost (charged per successful image -- see pricing).

Only effective in interleaved text-image mode (enable_interleave=true).

  • Function: Specifies the maximum number of images the model can generate in a single response.
  • Range: 1 to 5. Default value is 5.
  • This parameter sets the maximum image count. Model may generate fewer (e.g., request 5, get 3).

prompt_extend *bool* (Optional) Only effective in image editing mode (enable_interleave = false). This parameter enables intelligent prompt rewriting (optimizes positive prompt only, leaves negative prompt unchanged).

  • true (default)
  • false

watermark *bool* (Optional) Adds a watermark label in the bottom-right corner of the image with fixed text "AI Generated".

  • false (default)
  • true

seed *integer* (optional) Random number seed. Valid range: \[0,2147483647\]. Using the same seed yields similar outputs. If omitted, the algorithm uses a random seed. Note: Image generation is probabilistic. Even with the same seed, results may vary.

Response parameters

Successful response

Save the task_id to query the task status and result.

json
{
 "output": {
 "task_status": "PENDING",
 "task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
 },
 "request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}

Error response

Task creation failed. See Error messages.

json
{
 "code": "InvalidApiKey",
 "message": "No API-key provided.",
 "request_id": "7438d53d-6eb8-4596-8835-xxxxxx"
}
     **output** `*object*`  Task output information.

Properties

task_id *string* The task ID. Valid for queries for 24 hours.

task_status *string* The status of the task. Enumeration values

  • PENDING
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELED
  • UNKNOWN: The task does not exist or its status is unknown.

request_id *string* Unique request identifier for tracing and troubleshooting.

code *string* Error code. Returned only for failed requests. See Error messages.

message *string* Detailed error message. Returned only for failed requests. See Error messages.

Step 2: Query results using task ID

Singapore

GET https://dashscope-intl.aliyuncs.com/api/v1/tasks/{task_id}

Virginia

GET https://dashscope-us.aliyuncs.com/api/v1/tasks/{task_id}

Beijing

GET https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}

Frankfurt

GET https://++{WorkspaceId}.eu-central-1.maas.aliyuncs.com++/api/v1/tasks/{task_id}

When you make a call, replace {WorkspaceId} with your actual Workspace ID. Note

  • Polling recommendation: Image generation is time-consuming. Use a polling mechanism with a reasonable interval, such as 10 seconds.

  • Task state transition: PENDING → RUNNING → SUCCEEDED or FAILED.

  • Result link : After a task succeeds, an image URL valid for 24 hours is returned. Download and save the image to permanent storage, such as OSS.

Request parameters

## Query task results

Replace {task_id} with the task_id value returned by the previous API call. The task_id is valid for queries for 24 hours.

curl
curl -X GET https://dashscope-intl.aliyuncs.com/api/v1/tasks/{task_id} \\
--header "Authorization: Bearer $DASHSCOPE_API_KEY"
Request headers

Authorization *string* (Required) Authenticates the request with a Model Studio API key. Example: Bearer sk-xxxx.

URL path parameters

task_id *string* (Required) The ID of the task.

Response parameters

## Successful task execution

Task data (task status and image URLs) is retained for only 24 hours and then automatically purged. Save generated images promptly.

json
{
 "request_id": "43d9e959-25bc-4dc7-9888-xxxxxx",
 "output": {
 "task_id": "858cad55-4bdc-4ba3-ae6c-xxxxxx",
 "task_status": "SUCCEEDED",
 "submit_time": "2025-12-16 04:21:02.275",
 "scheduled_time": "2025-12-16 04:21:02.304",
 "end_time": "2025-12-16 04:24:46.658",
 "finished": true,
 "choices": \[
 {
 "finish_reason": "stop",
 "message": {
 "role": "assistant",
 "content": \[
 {
 "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/1xxx.png?Expires=xxx",
 "type": "image"
 }
 \]
 }
 },
 {
 "finish_reason": "stop",
 "message": {
 "role": "assistant",
 "content": \[
 {
 "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/1xxx.png?Expires=xxx",
 "type": "image"
 }
 \]
 }
 }
 \]
 },
 "usage": {
 "size": "1376*768",
 "total_tokens": 0,
 "image_count": 2,
 "output_tokens": 0,
 "input_tokens": 0
 }
}

## Task execution failure

If the task fails, error information is returned. Use the code and message fields to identify the cause. See Error messages for troubleshooting.

json
{
 "request_id": "a4d78a5f-655f-9639-8437-xxxxxx",
 "code": "InvalidParameter",
 "message": "num_images_per_prompt must be 1"
}
     **output** `*object*`  Task output information.

Properties

task_id *string* The task ID. Valid for queries for 24 hours.

task_status *string* The status of the task. Enumeration values

  • PENDING
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELED
  • UNKNOWN: The task does not exist or its status is unknown.

State transitions during polling:

  • PENDING → RUNNING → SUCCEEDED or FAILED.
  • The initial query status is usually PENDING or RUNNING.
  • When the status changes to SUCCEEDED, the response contains the generated image URL.
  • If the status is FAILED, check the error message and retry the task.

submit_time *string* The time when the task was submitted. The time is in UTC+8 and the format is YYYY-MM-DD HH:mm:ss.SSS.

scheduled_time *string* The time when the task was executed. The time is in UTC+8 and the format is YYYY-MM-DD HH:mm:ss.SSS.

end_time *string* The time when the task was completed. The time is in UTC+8 and the format is YYYY-MM-DD HH:mm:ss.SSS.

finished *bool* Request completion flag.

  • true
  • false

choices *array of object * Model-generated output content. Properties

finish_reason&nbsp;*string* Reason for task termination. Naturally stops with stop.

message *object* Message returned by the model. Properties

**role ***string* Message role, fixed as assistant.

**content ***array*Properties

type *string* Output type. Enumerated values: text, image.

text *string* Generated text.

image *string* URL of the generated image in PNG format. Link expires after 24 hours. Download and save the image promptly.

usage *object* Output statistics. Counts only successful results. Properties

image_count *integer* Number of generated images.

size *string* Resolution of generated images. Example: 1376*768.

input_tokens *integer* Input token count. Billed per image count. Currently fixed at 0.

output_tokens *integer* Output token count. Billed per image count. Currently fixed at 0.

**total_tokens ***integer* Total token count. Billed per image count. Currently fixed at 0.

request_id *string* Unique request identifier for tracing and troubleshooting.

code *string* Error code. Returned only for failed requests. See Error messages.

message *string* Detailed error message. Returned only for failed requests. See Error messages.

DashScope Python SDK

SDK parameters align with the HTTP interface (structures adapted per language).

The SDK handles asynchronous calls internally and supports both synchronous and asynchronous invocation. Actual duration varies by queue length and service load. Important

Ensure your DashScope Python SDK version is at least 1.25.8 before running the following code. For updates, see Install SDK.

The base_url and API key are region-specific. The following example shows a call from the Singapore region:

Singapore

https://dashscope-intl.aliyuncs.com/api/v1

Virginia

https://dashscope-us.aliyuncs.com/api/v1

Beijing

https://dashscope.aliyuncs.com/api/v1

Frankfurt

https://++{WorkspaceId}.eu-central-1.maas.aliyuncs.com++/api/v1

Replace WorkspaceId with your actual Workspace ID.

The global deployment scope (Frankfurt region) only supports asynchronous calls.

Image editing

Synchronous

Request example
HELPCODEESCAPE-python
import os
import dashscope
from dashscope.aigc.image_generation import ImageGeneration
from dashscope.api_entities.dashscope_response import Message


dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# If environment variable is not configured, replace the next line with: api_key="sk-xxx"
# API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

message = Message(
    role="user",
    # Supports local files, e.g., "image": "file://umbrella1.png"
    content=[
        {
            "text": "Generate a tomato and egg stir-fry based on the style of image 1 and the background of image 2"
        },
        {
            "image": "https://cdn.wanx.aliyuncs.com/tmp/pressure/umbrella1.png"
        },
        {
            "image": "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"
        }
    ]
)
print("----sync call, wait a moment----")
rsp = ImageGeneration.call(
        model='wan2.6-image',
        api_key=api_key,
        messages=[message],
        negative_prompt="",
        prompt_extend=True,
        watermark=False,
        n=1,
        enable_interleave=False,
        size="1K"
    )

print(rsp)
Response example

URL expires after 24 hours. Download images promptly.

HELPCODEESCAPE-json
{
    "status_code": 200,
    "request_id": "b6a4c68d-3a91-4018-ae96-3cf373xxxxxx",
    "code": "",
    "message": "",
    "output": {
        "text": null,
        "finish_reason": null,
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxxxxx.png?Expires=xxxxxx",
                            "type": "image"
                        }
                    ]
                }
            }
        ],
        "audio": null,
        "finished": true
    },
    "usage": {
        "input_tokens": 0,
        "output_tokens": 0,
        "characters": 0,
        "image_count": 1,
        "size": "1376*768",
        "total_tokens": 0
    }
}

Asynchronous

Request example
HELPCODEESCAPE-python
import os
import dashscope
from dashscope.aigc.image_generation import ImageGeneration
from dashscope.api_entities.dashscope_response import Message
from http import HTTPStatus

# Singapore region base_url. Base URLs differ by region.
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# If environment variable is not configured, replace the next line with: api_key="sk-xxx"
# API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

# Create asynchronous task
def create_async_task():
    print("Creating async task...")
    message = Message(
        role="user",
        content=[
            {'text': 'Generate a tomato and egg stir-fry based on the style of image 1 and the background of image 2'},
            {'image': 'https://cdn.wanx.aliyuncs.com/tmp/pressure/umbrella1.png'},
            {'image': 'https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp'}
        ]
    )
    response = ImageGeneration.async_call(
        model="wan2.6-image",
        api_key=api_key,
        messages=[message],
        negative_prompt="",
        prompt_extend=True,
        watermark=False,
        n=1,
        enable_interleave=False,
        size="1K"
    )

    if response.status_code == 200:
        print("Task created successfully:", response)
        return response  # Return task ID
    else:
        raise Exception(f"Failed to create task: {response.code} - {response.message}")

# Wait for task completion
def wait_for_completion(task_response):
    print("Waiting for task completion...")
    status = ImageGeneration.wait(task=task_response, api_key=api_key)

    if status.output.task_status == "SUCCEEDED":
        print("Task succeeded!")
        print("Response:", status)
    else:
        raise Exception(f"Task failed with status: {status.output.task_status}")

# Fetch asynchronous task info
def fetch_task_status(task):
    print("Fetching task status...")
    status = ImageGeneration.fetch(task=task, api_key=api_key)

    if status.status_code == HTTPStatus.OK:
        print("Task status:", status.output.task_status)
        print("Response details:", status)
    else:
        print(f"Failed to fetch status: {status.code} - {status.message}")

# Cancel asynchronous task
def cancel_task(task):
    print("Canceling task...")
    response = ImageGeneration.cancel(task=task, api_key=api_key)

    if response.status_code == HTTPStatus.OK:
        print("Task canceled successfully:", response.output.task_status)
    else:
        print(f"Failed to cancel task: {response.code} - {response.message}")

# Main execution flow
if __name__ == "__main__":
    task = create_async_task()
    wait_for_completion(task)
Response example
  1. Task creation response example

    HELPCODEESCAPE-json
    {
        "status_code": 200,
        "request_id": "4fb3050f-de57-4a24-84ff-e37ee5xxxxxx",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": null,
            "audio": null,
            "task_id": "127ec645-118f-4884-955d-0eba8dxxxxxx",
            "task_status": "PENDING"
        },
        "usage": {
            "input_tokens": 0,
            "output_tokens": 0,
            "characters": 0
        }
    }
  2. Task result query response example

    URL expires after 24 hours. Download images promptly.

    HELPCODEESCAPE-json
    {
        "status_code": 200,
        "request_id": "b2a7fab4-5e00-4b0a-86fe-8b9964xxxxxx",
        "code": null,
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxxxxx.png?Expires=xxxxxx",
                                "type": "image"
                            }
                        ]
                    }
                }
            ],
            "audio": null,
            "task_id": "127ec645-118f-4884-955d-0eba8xxxxxx",
            "task_status": "SUCCEEDED",
            "submit_time": "2026-01-09 17:52:04.136",
            "scheduled_time": "2026-01-09 17:52:04.164",
            "end_time": "2026-01-09 17:52:25.408",
            "finished": true
        },
        "usage": {
            "input_tokens": 0,
            "output_tokens": 0,
            "characters": 0,
            "size": "1376*768",
            "total_tokens": 0,
            "image_count": 1
        }
    }

Interleaved text-image output

Synchronous (streaming only)

Request example
HELPCODEESCAPE-python
import os
import dashscope
from dashscope.aigc.image_generation import ImageGeneration
from dashscope.api_entities.dashscope_response import Message

# Singapore region URL. Base URLs differ by region.
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# If environment variable is not configured, replace the next line with: api_key="sk-xxx"
# API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

def sync_call_with_stream():
    print("\n========== Synchronous call - Streaming text-image output ==========")

    image_message = Message(
        role="user",
        content=[
            {
                "text": "Give me a three-image tutorial for stir-fried pork with chili peppers"
            }
        ]
    )

    image_stream_res = ImageGeneration.call(
        model="wan2.6-image",
        api_key=api_key,
        messages=[image_message],
        stream=True,  # Streaming only
        negative_prompt="",
        enable_interleave=True,
        max_images=3,
        size="1280*1280"
    )

    print("Streaming output results:")
    for stream_res in image_stream_res:
        print(stream_res)

if __name__ == "__main__":
    sync_call_with_stream()
Response example

URL expires after 24 hours. Download images promptly.

HELPCODEESCAPE-json
{"status_code": 200, "request_id": "5b98e8f3-aeff-4c20-a26c-499a7525axxx", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"type": "text", "text": "Chili"}]}​}], "audio": null, "finished": false}, "usage": {"input_tokens": 28, "output_tokens": 0, "characters": 0, "total_tokens": 28, "image_count": 0, "size": "0*0"}​}
{"status_code": 200, "request_id": "5b98e8f3-aeff-4c20-a26c-499a7525axxx", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"type": "text", "text": "Stir-fry"}]}​}], "audio": null, "finished": false}, "usage": {"input_tokens": 28, "output_tokens": 1, "characters": 0, "total_tokens": 29, "image_count": 0, "size": "0*0"}​}
{"status_code": 200, "request_id": "5b98e8f3-aeff-4c20-a26c-499a7525axxx", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"type": "text", "text": "Pork"}]}​}], "audio": null, "finished": false}, "usage": {"input_tokens": 28, "output_tokens": 2, "characters": 0, "total_tokens": 30, "image_count": 0, "size": "0*0"}​}

......

{"status_code": 200, "request_id": "5b98e8f3-aeff-4c20-a26c-499a7525axxx", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "null", "message": {"role": "assistant", "content": [{"type": "text", "text": "."}]}​}], "audio": null, "finished": false}, "usage": {"input_tokens": 28, "output_tokens": 398, "characters": 0, "total_tokens": 426, "image_count": 2, "size": "1280*1280"}​}
{"status_code": 200, "request_id": "5b98e8f3-aeff-4c20-a26c-499a7525axxx", "code": "", "message": "", "output": {"text": null, "finish_reason": "stop", "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": [{"type": "image", "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx"}]}​}], "audio": null, "finished": true}, "usage": {"input_tokens": 28, "output_tokens": 523, "characters": 0, "total_tokens": 551, "image_count": 3, "size": "1280*1280"}​}

Asynchronous

Request example

Note: Asynchronous calls do not require the stream parameter

HELPCODEESCAPE-python
import os
import dashscope
from dashscope.aigc.image_generation import ImageGeneration
from dashscope.api_entities.dashscope_response import Message
from http import HTTPStatus

# Singapore region URL. Base URLs differ by region.
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# If environment variable is not configured, replace the next line with: api_key="sk-xxx"
# API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

def main():
    """Asynchronous call - Text-image output"""
    print("========== wan2.6-image Asynchronous call - Text-image output ==========")

    image_message = Message(
        role="user",
        content=[
            {
                "text": "Give me a three-image tutorial for stir-fried pork with chili peppers"
            }
        ]
    )

    # Create asynchronous task
    print("---async call, creating task----")
    response = ImageGeneration.async_call(
        model="wan2.6-image",
        api_key=api_key,
        messages=[image_message],
        # Asynchronous calls do not require stream parameter
        negative_prompt="",
        enable_interleave=True,
        max_images=3,
        size="1280*1280"
    )

    if response.status_code == HTTPStatus.OK:
        print(f"Task created successfully:")
        print(response)

        # Wait for task completion
        print("\n---waiting for task completion----")
        status = ImageGeneration.wait(task=response, api_key=api_key)

        if status.output.task_status == "SUCCEEDED":
            print("Task completed!")
            print(f"Results:")
            print(status)
        else:
            print(f"Task failed, status: {status.output.task_status}")
    else:
        print(f"Task creation failed: {response.code} - {response.message}")

if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print(f"Execution error: {str(e)}")
        import traceback
        traceback.print_exc()
Response example
  1. Task creation response example

    HELPCODEESCAPE-json
    {
        "status_code": 200,
        "request_id": "4fb3050f-de57-4a24-84ff-e37ee5xxxxxx",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": null,
            "audio": null,
            "task_id": "5c67585e-a3be-4943-b04d-c3fbb2xxxxxx",
            "task_status": "PENDING"
        },
        "usage": {
            "input_tokens": 0,
            "output_tokens": 0,
            "characters": 0
        }
    }
  2. Task result query response example

    URL expires after 24 hours. Download images promptly.

    HELPCODEESCAPE-json
    {
        "status_code": 200,
        "request_id": "997a759b-fbb9-4b35-9a4d-6dab1xxxxxx",
        "code": null,
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "Stir-fried pork with chili peppers is a classic Hunan dish and a beloved home-cooked favorite for many. Known for its fresh spiciness and tender meat, it's simple to prepare yet delivers an exceptional flavor experience. Today, we'll learn how to make this dish.\n\nFirst, preparing all ingredients is the key to success. Fresh pork, red and green chili peppers, garlic cloves, and ginger slices are essential. Slice the pork thinly, cut the chilies into segments, and mince the garlic and ginger.",
                                "type": "text"
                            },
                            {
                                "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                                "type": "image"
                            },
                            {
                                "text": "Next comes the crucial stir-frying step. Heat oil in a wok over high heat. Add minced garlic and ginger to release their aroma, then add the sliced pork. Quickly stir-fry until the pork changes color. Once fragrant, add the chili segments and continue stir-frying to fully release the chili aroma, perfectly blending with the pork's tenderness.",
                                "type": "text"
                            },
                            {
                                "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                                "type": "image"
                            },
                            {
                                "text": "Finally, season with light soy sauce, dark soy sauce, oyster sauce, and a pinch of sugar. Stir-fry quickly until evenly coated. Cook until the sauce thickens slightly, then turn off the heat and serve. Your delicious, aromatic stir-fried pork with chili peppers is ready!",
                                "type": "text"
                            },
                            {
                                "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                                "type": "image"
                            }
                        ]
                    }
                }
            ],
            "audio": null,
            "task_id": "5c67585e-a3be-4943-b04d-c3fbb2xxxxxx",
            "task_status": "SUCCEEDED",
            "submit_time": "2026-01-16 17:47:39.469",
            "scheduled_time": "2026-01-16 17:47:39.804",
            "end_time": "2026-01-16 17:49:46.736",
            "finished": true
        },
        "usage": {
            "input_tokens": 29,
            "output_tokens": 477,
            "characters": 0,
            "size": "1280*1280",
            "total_tokens": 506,
            "image_count": 3
        }
    }

DashScope Java SDK

SDK parameters align with the HTTP interface. Parameter structures are encapsulated per language conventions.

The SDK handles HTTP asynchronous calls internally and supports both synchronous and asynchronous invocation. Actual duration depends on queue length and service load. Important

Ensure your DashScope Java SDK version is at least 2.22.6 before running the following code.

The base_url and API key are not interchangeable across regions. The following examples show how to make API calls for the Singapore region:

Singapore

https://dashscope-intl.aliyuncs.com/api/v1

Virginia

https://dashscope-us.aliyuncs.com/api/v1

Beijing

https://dashscope.aliyuncs.com/api/v1

Frankfurt

https://++{WorkspaceId}.eu-central-1.maas.aliyuncs.com++/api/v1

Replace WorkspaceId with your actual Workspace ID.

The global deployment scope (Frankfurt region) only supports asynchronous calls.

Image editing

Synchronous

Request example
HELPCODEESCAPE-java
import com.alibaba.dashscope.aigc.imagegeneration.*;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

import java.util.Arrays;
import java.util.Collections;

/**
 * wan2.6-image Image editing - Synchronous call example
 */
public class Main {

    static {
        // Singapore region URL. Base URLs differ by region.
        Constants.baseHttpApiUrl = "https://dashscope-intl.aliyuncs.com/api/v1";
    }

    // If environment variable is not configured, replace the next line with: apiKey="sk-xxx"
    // API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    public static void basicCall() throws ApiException, NoApiKeyException, UploadFileException {
        // Build multi-image input message
        ImageGenerationMessage message = ImageGenerationMessage.builder()
                .role("user")
                .content(Arrays.asList(
                        // Supports multi-image input; provide multiple reference images
                        Collections.singletonMap("text", "Generate a tomato and egg stir-fry based on the style of image 1 and the background of image 2"),
                        Collections.singletonMap("image", "https://cdn.wanx.aliyuncs.com/tmp/pressure/umbrella1.png"),
                        Collections.singletonMap("image", "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp")
                )).build();

        // Image editing uses standard synchronous call; no need to set stream or enable_interleave
        ImageGenerationParam param = ImageGenerationParam.builder()
                .apiKey(apiKey)
                .model("wan2.6-image")
                .messages(Collections.singletonList(message))
                .n(1)
                .size("1K")
                .negativePrompt("")
                .promptExtend(true)
                .build();

        ImageGeneration imageGeneration = new ImageGeneration();
        ImageGenerationResult result = null;
        try {
            System.out.println("---sync call for image editing, wait a moment----");
            result = imageGeneration.call(param);
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            throw new RuntimeException(e.getMessage());
        }
        System.out.println(JsonUtils.toJson(result));
    }

    public static void main(String[] args) {
        try {
            basicCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
    }
}
Response example

URL expires after 24 hours. Download images promptly.

HELPCODEESCAPE-json
{
    "requestId": "b148327e-830f-414c-a8df-724dec28exxx",
    "usage": {
        "input_tokens": 0,
        "output_tokens": 0,
        "total_tokens": 0,
        "image_count": 1,
        "size": "1376*768"
    },
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                            "type": "image"
                        }
                    ]
                }
            }
        ],
        "finished": true
    },
    "status_code": 200,
    "code": "",
    "message": ""
}

Asynchronous

Request example
HELPCODEESCAPE-java
import com.alibaba.dashscope.aigc.imagegeneration.*;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

import java.util.Arrays;
import java.util.Collections;

/**
 * wan2.6-image Image editing - Asynchronous call example
 */
public class Main {

    static {
        // Singapore region URL. Base URLs differ by region.
        Constants.baseHttpApiUrl = "https://dashscope-intl.aliyuncs.com/api/v1";
    }

    // If environment variable is not configured, replace the next line with: apiKey="sk-xxx"
    // API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    public static void asyncCall() throws ApiException, NoApiKeyException, UploadFileException {
        // Build multi-image input message
        ImageGenerationMessage message = ImageGenerationMessage.builder()
                .role("user")
                .content(Arrays.asList(
                        // Supports multi-image input; provide multiple reference images
                        Collections.singletonMap("text", "Generate a tomato and egg stir-fry based on the style of image 1 and the background of image 2"),
                        Collections.singletonMap("image", "https://cdn.wanx.aliyuncs.com/tmp/pressure/umbrella1.png"),
                        Collections.singletonMap("image", "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp")
                )).build();

        ImageGenerationParam param = ImageGenerationParam.builder()
                .apiKey(apiKey)
                .model("wan2.6-image")
                .n(1)
                .size("1K")
                .negativePrompt("")
                .promptExtend(true)
                .messages(Arrays.asList(message))
                .build();

        ImageGeneration imageGeneration = new ImageGeneration();
        ImageGenerationResult result = null;
        try {
            System.out.println("---async call for image editing, creating task----");
            result = imageGeneration.asyncCall(param);
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            throw new RuntimeException(e.getMessage());
        }
        System.out.println("Task creation result:");
        System.out.println(JsonUtils.toJson(result));

        String taskId = result.getOutput().getTaskId();
        // Wait for task completion
        waitTask(taskId);
    }

    public static void waitTask(String taskId) throws ApiException, NoApiKeyException {
        ImageGeneration imageGeneration = new ImageGeneration();
        System.out.println("\n---waiting for task completion----");
        ImageGenerationResult result = imageGeneration.wait(taskId, apiKey);
        System.out.println("Task completion result:");
        System.out.println(JsonUtils.toJson(result));
    }

    public static void main(String[] args) {
        try {
            asyncCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
    }
}
Response example
  1. Task creation response example

    HELPCODEESCAPE-json
    {
        "status_code": 200,
        "request_id": "9cd85950-2e26-4b2c-b562-1694cf928xxx",
        "code": "",
        "message": "",
        "output": {
            "task_id": "4c861fbe-af89-4a2f-8fc5-4bb15c313xxx",
            "task_status": "PENDING"
        },
        "usage": null
    }
  2. Task result query response example

    URL expires after 24 hours. Download images promptly.

    HELPCODEESCAPE-json
    {
        "status_code": 200,
        "request_id": "cbdf1424-306e-4a52-82f3-8bf5d8a99xxx",
        "code": "",
        "message": "",
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                                "type": "image"
                            }
                        ]
                    }
                }
            ],
            "task_id": "4c861fbe-af89-4a2f-8fc5-4bb15c3139ba",
            "task_status": "SUCCEEDED",
            "submit_time": "2026-01-16 16:36:06.556",
            "scheduled_time": "2026-01-16 16:36:06.591",
            "end_time": "2026-01-16 16:36:25.190",
            "finished": true
        },
        "usage": {
            "input_tokens": 0,
            "output_tokens": 0,
            "size": "1376*768",
            "total_tokens": 0,
            "image_count": 1
        }
    }

Interleaved text-image output

Synchronous call (streaming only)

Request example
HELPCODEESCAPE-java
import com.alibaba.dashscope.aigc.imagegeneration.*;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;
import io.reactivex.Flowable;

import java.util.Collections;

/**
 * wan2.6-image Text-image output - Streaming call example
 */
public class Main {

    static {
        // Singapore region URL. Base URLs differ by region.
        Constants.baseHttpApiUrl = "https://dashscope-intl.aliyuncs.com/api/v1";
    }

    // If environment variable is not configured, replace the next line with: apiKey="sk-xxx"
    // API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    public static void streamCall() throws ApiException, NoApiKeyException, UploadFileException {
        ImageGenerationMessage message = ImageGenerationMessage.builder()
                .role("user")
                .content(Collections.singletonList(
                        Collections.singletonMap("text", "Give me a three-image tutorial for stir-fried pork with chili peppers")
                )).build();

        // Text-image output requires streaming call
        ImageGenerationParam param = ImageGenerationParam.builder()
                .apiKey(apiKey)
                .model("wan2.6-image")
                .messages(Collections.singletonList(message))
                .stream(true) // Must enable streaming output
                .enableInterleave(true)
                .size("1280*1280")
                .negativePrompt("")
                .maxImages(3)
                .build();

        ImageGeneration imageGeneration = new ImageGeneration();
        try {
            System.out.println("---stream call for image interleave----");
            Flowable&lt;ImageGenerationResult&gt; resultFlowable = imageGeneration.streamCall(param);
            resultFlowable.blockingForEach(result -> {
                System.out.println(JsonUtils.toJson(result));
            });
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

    public static void main(String[] args) {
        try {
            streamCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}
Response example

URL expires after 24 hours. Download images promptly.

HELPCODEESCAPE-json
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":0,"total_tokens":28,"image_count":0,"size":"0*0"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"Chili"}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":1,"total_tokens":29,"image_count":0,"size":"0*0"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"stir-fry"}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":2,"total_tokens":30,"image_count":0,"size":"0*0"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"pork"}]}​}],"finished":false},"status_code":200,"code":"","message":""}

......

{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":73,"total_tokens":101,"image_count":0,"size":"0*0"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"."}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":198,"total_tokens":226,"image_count":1,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"image","image":"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx"}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":199,"total_tokens":227,"image_count":1,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"Next"}]}​}],"finished":false},"status_code":200,"code":"","message":""}

......

{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":245,"total_tokens":273,"image_count":1,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"."}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":368,"total_tokens":396,"image_count":2,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"image","image":"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx"}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":369,"total_tokens":397,"image_count":2,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"Finally"}]}​}],"finished":false},"status_code":200,"code":"","message":""}

......

{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":416,"total_tokens":444,"image_count":2,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"pot"}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":417,"total_tokens":445,"image_count":2,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":[{"type":"text","text":"."}]}​}],"finished":false},"status_code":200,"code":"","message":""}
{"requestId":"12c7432c-8028-4289-a97c-4e22df98bxxx","usage":{"input_tokens":28,"output_tokens":541,"total_tokens":569,"image_count":3,"size":"1280*1280"},"output":{"choices":[{"finish_reason":"stop","message":{"role":"assistant","content":[{"type":"image","image":"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx"}]}​}],"finished":true},"status_code":200,"code":"","message":""}

Asynchronous call

Request example

Note: Asynchronous calls do not require the stream parameter

HELPCODEESCAPE-java
import com.alibaba.dashscope.aigc.imagegeneration.*;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

import java.util.Collections;

/**
 * wan2.6-image Text-image output - Asynchronous call example
 */
public class Main {

    static {
        // Singapore region URL. Base URLs differ by region.
        Constants.baseHttpApiUrl = "https://dashscope-intl.aliyuncs.com/api/v1";
    }

    // If environment variable is not configured, replace the next line with: apiKey="sk-xxx"
    // API keys differ by region. Get API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    public static void asyncCall() throws ApiException, NoApiKeyException, UploadFileException {
        ImageGenerationMessage message = ImageGenerationMessage.builder()
                .role("user")
                .content(Collections.singletonList(
                        Collections.singletonMap("text", "Give me a three-image tutorial for stir-fried pork with chili peppers")
                )).build();

        ImageGenerationParam param = ImageGenerationParam.builder()
                .apiKey(apiKey)
                .model("wan2.6-image")
                .size("1280*1280")
                .enableInterleave(true)
                .maxImages(3)
                .negativePrompt("")
                .messages(Collections.singletonList(message))
                .build();

        ImageGeneration imageGeneration = new ImageGeneration();
        ImageGenerationResult result = null;
        try {
            System.out.println("---async call for image interleave, creating task----");
            result = imageGeneration.asyncCall(param);
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            throw new RuntimeException(e.getMessage());
        }
        System.out.println("Task creation result:");
        System.out.println(JsonUtils.toJson(result));

        String taskId = result.getOutput().getTaskId();
        // Wait for task completion
        waitTask(taskId);
    }

    public static void waitTask(String taskId) throws ApiException, NoApiKeyException {
        ImageGeneration imageGeneration = new ImageGeneration();
        System.out.println("\n---waiting for task completion----");
        ImageGenerationResult result = imageGeneration.wait(taskId, apiKey);
        System.out.println("Task completion result:");
        System.out.println(JsonUtils.toJson(result));
    }

    public static void main(String[] args) {
        try {
            asyncCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
    }
}
Response example
  1. Task creation response example

    HELPCODEESCAPE-json
    {
        "requestId": "7d6c5760-334b-48c4-9b1e-08ee9c7fexxx",
        "output": {
            "task_id": "1bb9d9fa-bf1a-43dc-b5fe-366c1dc70xxx",
            "task_status": "PENDING"
        },
        "status_code": 200,
        "code": "",
        "message": ""
    }
  2. Task result query response example

    URL expires after 24 hours. Download images promptly.

    HELPCODEESCAPE-json
    {
        "requestId": "6ed62b00-2225-4fc3-8ee3-2aed0b484xxx",
        "usage": {
            "input_tokens": 29,
            "output_tokens": 471,
            "total_tokens": 500,
            "image_count": 3,
            "size": "1280*1280"
        },
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "Stir-fried pork with chili peppers is a classic Hunan dish and a beloved home-cooked favorite for many. Known for its fresh spiciness and tender meat, it's simple to prepare yet delivers an exceptional flavor experience. Today, we'll learn how to make this dish.\n\nFirst, preparing all ingredients is the key to success. Fresh pork, red and green chili peppers, garlic cloves, and ginger slices are essential. Slice the pork thinly, cut the chilies into segments, and mince the garlic and ginger.",
                                "type": "text"
                            },
                            {
                                "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                                "type": "image"
                            },
                            {
                                "text": "Next, marinate the pork. Place the sliced pork in a bowl, add a little light soy sauce, cooking wine, starch, and cooking oil. Mix well by hand and marinate for 10 to 15 minutes. This treatment makes the pork slices more tender and flavorful.",
                                "type": "text"
                            },
                            {
                                "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                                "type": "image"
                            },
                            {
                                "text": "Finally, heat oil in a wok over high heat. Add the marinated pork slices and quickly stir-fry until they change color, then remove and set aside. Leave some oil in the wok, add minced garlic and ginger to release their aroma, then add chili segments and stir-fry until fragrant. Add the pork back in, season with light soy sauce, dark soy sauce, a pinch of sugar, and oyster sauce. Stir-fry quickly until evenly coated, sprinkle with chopped scallions, and serve.",
                                "type": "text"
                            },
                            {
                                "image": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                                "type": "image"
                            }
                        ]
                    }
                }
            ],
            "task_id": "1bb9d9fa-bf1a-43dc-b5fe-366c1dc70836",
            "task_status": "SUCCEEDED",
            "finished": true,
            "submit_time": "2026-01-16 18:26:32.082",
            "scheduled_time": "2026-01-16 18:26:32.133",
            "end_time": "2026-01-16 18:28:41.748"
        },
        "status_code": 200,
        "code": "",
        "message": ""
    }

Limitations

  • Data validity : The task task_id and image url are retained for only 24 hours. After this period, they cannot be queried or downloaded.

  • Content moderation : Both the input prompt and output image undergo content moderation. Non-compliant content returns an IPInfringementSuspect or DataInspectionFailed error. See Error messages.

Billing and rate limiting

  • For model free quotas and pricing, see Model pricing.

  • For model rate limits, see Wan.

  • Billing: You are charged per successfully generated image. Failed calls incur no charge and don't consume free quota.

Error codes

If the model call fails and returns an error message, see Error messages for resolution.

FAQ

Q: How do I view a model's inference costs and call volume?

A: See Bill inquiry and cost management.

Q: Why can't I run the code examples?

A: Upgrade your SDK to the latest version. For updates, see Install SDK.

Mirror of Alibaba Cloud Model Studio docs for reference and RAG. Not affiliated with Alibaba Cloud.