Wan 2.1 (Text-to-Video)

This documentation is valid for the following list of our models:

  • wan/v2.1/1.3b/text-to-video

Overview

A state-of-the-art video foundation model designed for advanced generative video tasks. Supporting Text-to-Video (T2V), it incorporates groundbreaking innovations to deliver high-quality outputs with exceptional computational efficiency.

Key Features:

  • Visual text generation: Generates text in both Chinese and English within videos.

  • Output Quality: Produces videos at resolutions up to 720P with a frame rate of approximately 16 .

Setup your API Key

If you don’t have an API key for the AI/ML API yet, feel free to use our Quickstart guide.

How to Make a Call

Step-by-Step Instructions

Generating a video using this model involves sequentially calling two endpoints:

  • The first one is for creating and sending a video generation task to the server (returns a generation ID).

  • The second one is for requesting the generated video from the server using the generation ID received from the first endpoint.

Below, you can find two corresponding API schemas and examples for both endpoint calls.

API Schemas

Video Generation

This endpoint creates and sends a video generation task to the server — and returns a generation ID.

post
Authorizations
Body
modelundefined · enumRequiredPossible values:
promptstringRequired

The text prompt to guide video generation.

Example: Mona Lisa puts on glasses with her hands
negative_promptstringOptional

The negative prompt to use. Use it to address details that you don't want in the image. This could be colors, objects, scenery and even the small details (e.g. moustache, blurry, low resolution).

seedintegerOptional

Random seed for reproducibility. If None, a random seed is chosen.

aspect_ratiostring · enumOptional

Aspect ratio of the generated video (16:9 or 9:16).

Default: 16:9Possible values:
inference_stepsintegerOptional

Number of inference steps for sampling. Higher values give better quality but take longer.

Default: 30
guidance_scalenumberOptional

Classifier-free guidance scale. Controls prompt adherence / creativity.

Default: 5
shiftnumberOptional

Noise schedule shift parameter. Affects temporal dynamics.

Default: 5
samplerstring · enumOptional

The sampler to use for generation.

Default: unipcPossible values:
enable_safety_checkerbooleanOptional

If set to true, the safety checker will be enabled.

enable_prompt_expansionbooleanOptional

Whether to enable prompt expansion.

Responses
201Success
post
POST /v2/generate/video/alibaba/generation HTTP/1.1
Host: api.aimlapi.com
Authorization: Bearer <YOUR_AIMLAPI_KEY>
Content-Type: application/json
Accept: */*
Content-Length: 275

{
  "model": "wan/v2.1/1.3b/text-to-video",
  "prompt": "Mona Lisa puts on glasses with her hands",
  "negative_prompt": "text",
  "seed": 1,
  "aspect_ratio": "16:9",
  "inference_steps": 30,
  "guidance_scale": 5,
  "shift": 5,
  "sampler": "unipc",
  "enable_safety_checker": true,
  "enable_prompt_expansion": true
}
201Success

No content

Fetch the video

After sending a request for video generation, this task is added to the queue. This endpoint lets you check the status of a video generation task using its id, obtained from the endpoint described above. If the video generation task status is complete, the response will include the final result — with the generated video URL and additional metadata.

get
Authorizations
Query parameters
generation_idstringRequired
Responses
200Success
get
GET /v2/generate/video/alibaba/generation HTTP/1.1
Host: api.aimlapi.com
Authorization: Bearer <YOUR_AIMLAPI_KEY>
Accept: */*
200Success

No content

Full Example: Generating and Retrieving the Video From the Server

The code below creates a video generation task, then automatically polls the server every 10 seconds until it finally receives the video URL.

import requests
import time

# Insert your AIML API Key instead of <YOUR_AIMLAPI_KEY>:
aimlapi_key = "<YOUR_AIMLAPI_KEY>"
base_url = "https://api.aimlapi.com/v2"


# Creating and sending a video generation task to the server
def generate_video():
    url = f"{base_url}/generate/video/alibaba/generation"
    headers = {
        "Authorization": f"Bearer {aimlapi_key}", 
    }

    data = {
        "model": "wan/v2.1/1.3b/text-to-video",
        "prompt": '''
A menacing evil dragon appears in a distance above the tallest mountain, then rushes toward the camera with its jaws open, revealing massive fangs. We see it's coming.
'''
    }
 
    response = requests.post(url, json=data, headers=headers)
    
    if response.status_code >= 400:
        print(f"Error: {response.status_code} - {response.text}")
    else:
        response_data = response.json()
        # print(response_data)
        return response_data
    

# Requesting the result of the task from the server using the generation_id
def get_video(gen_id):
    url = f"{base_url}/generate/video/alibaba/generation"
    params = {
        "generation_id": gen_id,
    }
    
    headers = {
        "Authorization": f"Bearer {aimlapi_key}", 
        "Content-Type": "application/json"
        }

    response = requests.get(url, params=params, headers=headers)
    # print("Generation:", response.json())
    return response.json()



def main():
     # Running video generation and getting a task id
    gen_response = generate_video()
    gen_id = gen_response.get("id")
    print("Gen_ID:  ", gen_id)

    # Trying to retrieve the video from the server every 10 sec
    if gen_id:
        start_time = time.time()

        timeout = 1000
        while time.time() - start_time < timeout:
            response_data = get_video(gen_id)

            if response_data is None:
                print("Error: No response from API")
                break
        
            status = response_data.get("status")
            print("Status:", status)

            if status == "waiting" or status == "active" or  status == "queued" or status == "generating":
                print("Still waiting... Checking again in 10 seconds.")
                time.sleep(10)
            else:
                print("Processing complete:/n", response_data)
                return response_data
   
        print("Timeout reached. Stopping.")
        return None     


if __name__ == "__main__":
    main()
Response
Gen_ID:   961fc4df-c678-433b-bb60-7ec2734c6ec1:wan/v2.1/1.3b/text-to-video
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: queued
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: completed
Processing complete:/n {'id': '961fc4df-c678-433b-bb60-7ec2734c6ec1:wan/v2.1/1.3b/text-to-video', 'status': 'completed', 'video': {'url': 'https://cdn.aimlapi.com/eagle/files/kangaroo/g0YHQYqt-Dq8vs_CNsbuw_tmp2flwoar8.mp4', 'content_type': 'application/octet-stream', 'file_name': 'tmp2flwoar8.mp4', 'file_size': 3758467}}

Original: 832x480

Low-res GIF preview:

"A menacing evil dragon appears in a distance above the tallest mountain, then rushes toward the camera with its jaws open, revealing massive fangs. We see it's coming."

Last updated

Was this helpful?