Claude Opus 5 is now live on CometAPI →
Q

Wan2.7

Per Second:$0.08
Released:May 31, 2026

Wan2.7 is a video generation model designed for high-quality visual synthesis and improved motion consistency. It is suitable for cinematic content creation and professional video production workflows.

New
Commercial Use

Technical Specifications of Wan 2.7

ItemWan 2.7 (Video Suite)
ProviderAlibaba Tongyi Lab
Model familyWan 2.7 Video Suite
Architecture27B parameter Mixture-of-Experts (MoE)
Input typesText, images, videos, audio references
Output typesGenerated / edited video clips with optional audio
Supported modesText-to-video (T2V), Image-to-video (I2V), Reference-to-video (R2V), Video Editing
Resolution720P and 1080P outputs
Video duration2–15 seconds
Audio supportNative audio generation, voice references, lip-sync workflows
Reference capabilityMulti-reference images/videos, identity consistency
Character consistencySupports up to multiple reference subjects depending on workflow
Release generationMajor successor to Wan 2.6

What is Wan 2.7?

Wan 2.7 is Alibaba’s flagship multimodal video generation suite built for controllable AI filmmaking workflows rather than simple prompt-to-video creation. The model family combines generation, editing, continuation, and reference-driven consistency into one system, enabling creators to build short cinematic clips with stronger subject preservation and scene control.

Unlike earlier video generators that focused mostly on prompt quality, Wan 2.7 emphasizes controllability through frame anchoring, reference inputs, audio synchronization, and structured multi-shot workflows.

Main Features of Wan 2.7

  • Thinking Mode planning pipeline: The model plans scene composition and motion before rendering, improving prompt adherence and reducing coherence failures.
  • First-frame and last-frame control: Users can define opening and ending frames so the system interpolates motion between them.
  • Reference-driven identity consistency: Maintain character appearance, clothing, objects, and style across multiple shots.
  • Native multimodal workflows: Supports text, image, audio, and video references inside the same workflow.
  • Integrated audio generation: Background music, environmental sounds, and voice synchronization can be generated alongside visuals.
  • Editing and continuation support: Existing videos can be extended, transformed, or re-styled without rebuilding from scratch.

Benchmark Performance of Wan 2.7

Public benchmark disclosure for Wan 2.7 remains limited compared with text LLMs, but third-party evaluations and community testing indicate notable improvements in motion stability, prompt adherence, and controllability over Wan 2.6.

Reported ecosystem observations include:

  • Stronger motion continuity versus earlier Wan releases.
  • Higher leaderboard placement in third-party text-to-video evaluations.
  • Improved multi-subject consistency and reference preservation.
  • Better audio integration than many earlier open video models.

Formal benchmark transparency is still limited, so performance claims should be interpreted cautiously.

Wan 2.7 vs Other Video Models

FeatureWan 2.7Veo 3.1Seedance 2.0
Native audio workflowsStrongStrongModerate
Reference-driven consistencyStrongModerateModerate
First + Last Frame controlYesPartialLimited
Video editing workflowsYesYesLimited
Max common resolution1080PHigher-end cinematic output1080P
Multi-reference supportStrong emphasisModerateModerate

Limitations of Wan 2.7

  • Short clip duration compared with long-form production tools.
  • 1080P maximum output limits ultra-high-resolution workflows.
  • Fast motion scenes may still produce instability artifacts.
  • Multi-reference workflows increase complexity and prompt engineering requirements.
  • Public benchmark reporting remains relatively sparse.

Representative Use Cases

  1. Character-consistent short films and storyboards.
  2. Marketing clips with audio synchronization.
  3. Social media video generation.
  4. Product visualization and concept trailers.
  5. Video continuation and scene interpolation workflows.
  6. Reference-based avatar and character animation.

How to Use the WAN 2.7 Video API in CometAPI

Step 1: Try the WAN 2.7 Video API in the Kie Al Playground

First, test the WAN 2.7 functionality using the WAN 2.7 Video API in the CometAPI Playground. Upload images, add prompts, or use references to preview the generated WAN video before integrating the WAN 2.7 AI video into your production workflow.

Step 2: Obtain the WAN 2.7 API key and review the API documentation

Obtain the WAN 2.7 API key from the CometAPI console and review the documentation. Understand the WAN 2.7 Video API endpoints, authentication, and parameters to support text-to-video, image-to-video, and WAN video workflows.

Step 3: Generate WAN 2.7 AI videos and integrate them into your workflow

Use the WAN 2.7 Video API to generate WAN 2.7 AI videos with prompts, images, or references. Integrate WAN 2.7 outputs into product workflows, content pipelines, or AI video tools to enable scalable video creation.

FAQ

Pricing for Wan2.7

Explore competitive pricing for Wan2.7, designed to fit various budgets and usage needs. Our flexible plans ensure you only pay for what you use, making it easy to scale as your requirements grow. Discover how Wan2.7 can enhance your projects while keeping costs manageable.

Wan Video Generation Pricing

Pricing (Per Second)

Model720p1080p
wan2.6$0.08$0.12
wan2.7$0.08$0.12

💡 Billed per second. Total cost = price per second × video duration (seconds).

Sample code and API for Wan2.7

Access comprehensive sample code and API resources for Wan2.7 to streamline your integration process. Our detailed documentation provides step-by-step guidance, helping you leverage the full potential of Wan2.7 in your projects.

# Create a video with wan2.7
# Step 1: Submit the video generation request
echo "Submitting video generation request..."
response=$(curl -s https://api.cometapi.com/v1/videos \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -F "model=wan2.7" \
  -F "prompt=Create a cinematic detective sequence with clear timed shots. Shot 1 [0-2s]: a rainy city street at night, neon signs reflected in puddles. Shot 2 [2-4s]: a detective in a dark coat enters an old building. Shot 3 [4-5s]: close-up on a clue lit by a narrow flashlight beam." \
  -F "seconds=5" \
  -F "size=1280x720")

echo "Response: $response"

# Extract video_id from response (handle JSON with spaces like "id": "xxx")
video_id=$(echo "$response" | tr -d '
' | sed 's/.*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
echo "Video ID: $video_id"

# Step 2: Poll for progress until 100%
echo ""
echo "Checking video generation progress..."
while true; do
  status_response=$(curl -s "https://api.cometapi.com/v1/videos/$video_id" \
    -H "Authorization: Bearer $COMETAPI_KEY")

  progress=$(echo "$status_response" | grep -o '"progress"[[:space:]]*:[[:space:]]*"\?[^",}]*"\?' | head -1 | sed 's/.*:[[:space:]]*"\?//;s/"$//')
  status=$(echo "$status_response" | grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"status"[[:space:]]*:[[:space:]]*"//;s/"$//')

  echo "Progress: $progress, Status: $status"

  if [ "$status" = "FAILURE" ] || [ "$status" = "failed" ] || [ "$status" = "error" ]; then
    echo "Video generation failed!"
    exit 1
  fi

  if [ "$progress" = "100%" ] || [ "$progress" = "100" ] || [ "$status" = "completed" ] || [ "$status" = "success" ]; then
    echo "Video generation completed!"
    break
  fi

  sleep 10
done

# Step 3: Download the video to output directory
echo ""
echo "Downloading video to ./output/$video_id.mp4..."
mkdir -p ./output
curl -s "https://api.cometapi.com/v1/videos/$video_id/content" \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -o "./output/$video_id.mp4"

if [ -f "./output/$video_id.mp4" ]; then
  echo "Video saved to ./output/$video_id.mp4"
  ls -la "./output/$video_id.mp4"
else
  echo "Failed to download video"
  exit 1
fi

cURL Code Example

# Create a video with wan2.7
# Step 1: Submit the video generation request
echo "Submitting video generation request..."
response=$(curl -s https://api.cometapi.com/v1/videos \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -F "model=wan2.7" \
  -F "prompt=Create a cinematic detective sequence with clear timed shots. Shot 1 [0-2s]: a rainy city street at night, neon signs reflected in puddles. Shot 2 [2-4s]: a detective in a dark coat enters an old building. Shot 3 [4-5s]: close-up on a clue lit by a narrow flashlight beam." \
  -F "seconds=5" \
  -F "size=1280x720")

echo "Response: $response"

# Extract video_id from response (handle JSON with spaces like "id": "xxx")
video_id=$(echo "$response" | tr -d '\n' | sed 's/.*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
echo "Video ID: $video_id"

# Step 2: Poll for progress until 100%
echo ""
echo "Checking video generation progress..."
while true; do
  status_response=$(curl -s "https://api.cometapi.com/v1/videos/$video_id" \
    -H "Authorization: Bearer $COMETAPI_KEY")
  
  progress=$(echo "$status_response" | grep -o '"progress"[[:space:]]*:[[:space:]]*"\?[^",}]*"\?' | head -1 | sed 's/.*:[[:space:]]*"\?//;s/"$//')
  status=$(echo "$status_response" | grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"status"[[:space:]]*:[[:space:]]*"//;s/"$//')
  
  echo "Progress: $progress, Status: $status"
  
  if [ "$status" = "FAILURE" ] || [ "$status" = "failed" ] || [ "$status" = "error" ]; then
    echo "Video generation failed!"
    exit 1
  fi
  
  if [ "$progress" = "100%" ] || [ "$progress" = "100" ] || [ "$status" = "completed" ] || [ "$status" = "success" ]; then
    echo "Video generation completed!"
    break
  fi
  
  sleep 10
done

# Step 3: Download the video to output directory
echo ""
echo "Downloading video to ./output/$video_id.mp4..."
mkdir -p ./output
curl -s "https://api.cometapi.com/v1/videos/$video_id/content" \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -o "./output/$video_id.mp4"

if [ -f "./output/$video_id.mp4" ]; then
  echo "Video saved to ./output/$video_id.mp4"
  ls -la "./output/$video_id.mp4"
else
  echo "Failed to download video"
  exit 1
fi

Python Code Example

# Create a video with wan2.7 using raw HTTP requests
import os
import time
import requests

api_key = os.environ.get("COMETAPI_KEY")
base_url = "https://api.cometapi.com/v1"
headers = {"Authorization": f"Bearer {api_key}"}

# Step 1: Submit the video generation request
print("Submitting video generation request...")
response = requests.post(
    f"{base_url}/videos",
    headers=headers,
    files={
        "model": (None, "wan2.7"),
        "prompt": (None, "Create a cinematic detective sequence with clear timed shots. Shot 1 [0-2s]: a rainy city street at night, neon signs reflected in puddles. Shot 2 [2-4s]: a detective in a dark coat enters an old building. Shot 3 [4-5s]: close-up on a clue lit by a narrow flashlight beam."),
        "seconds": (None, "5"),
        "size": (None, "1280x720"),
    },
)

result = response.json()
print(f"Response: {result}")

video_id = result.get("id") or result.get("task_id")
print(f"Video ID: {video_id}")

# Step 2: Poll for progress until 100%
print("\nChecking video generation progress...")
while True:
    try:
        status_response = requests.get(f"{base_url}/videos/{video_id}", headers=headers)
        status_result = status_response.json()

        data = status_result.get("data") or status_result
        progress = data.get("progress", "0%")
        status = data.get("status", "unknown")

        print(f"Progress: {progress}, Status: {status}")

        if status in ["FAILURE", "failed", "error"]:
            print("Video generation failed!")
            print(status_result)
            exit(1)

        if progress == "100%" or progress == 100 or status in ["completed", "success"]:
            print("Video generation completed!")
            break
    except Exception as e:
        print(f"Temporary error: {e}, retrying...")

    time.sleep(10)

# Step 3: Download the video to output directory
print(f"\nDownloading video to ./output/{video_id}.mp4...")
os.makedirs("./output", exist_ok=True)

video_response = requests.get(f"{base_url}/videos/{video_id}/content", headers=headers)

output_path = f"./output/{video_id}.mp4"
with open(output_path, "wb") as f:
    f.write(video_response.content)

if os.path.exists(output_path):
    file_size = os.path.getsize(output_path)
    print(f"Video saved to {output_path}")
    print(f"File size: {file_size} bytes")
else:
    print("Failed to download video")
    exit(1)

JavaScript Code Example

// Create a video with wan2.7 using raw HTTP requests
import fs from "fs";
import path from "path";

const apiKey = process.env.COMETAPI_KEY;
const baseUrl = "https://api.cometapi.com/v1";
const headers = { Authorization: `Bearer ${apiKey}` };

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// Step 1: Submit the video generation request
console.log("Submitting video generation request...");
const formData = new FormData();
formData.append("model", "wan2.7");
formData.append("prompt", "Create a cinematic detective sequence with clear timed shots. Shot 1 [0-2s]: a rainy city street at night, neon signs reflected in puddles. Shot 2 [2-4s]: a detective in a dark coat enters an old building. Shot 3 [4-5s]: close-up on a clue lit by a narrow flashlight beam.");
formData.append("seconds", "5");
formData.append("size", "1280x720");

const submitResponse = await fetch(`${baseUrl}/videos`, {
  method: "POST",
  headers,
  body: formData,
});

const result = await submitResponse.json();
console.log("Response:", JSON.stringify(result, null, 2));

const videoId = result.id || result.task_id;
console.log("Video ID:", videoId);

// Step 2: Poll for progress until 100%
console.log("\nChecking video generation progress...");
while (true) {
  try {
    const statusResponse = await fetch(`${baseUrl}/videos/${videoId}`, { headers });
    const statusResult = await statusResponse.json();
    const data = statusResult.data || statusResult;
    const progress = data.progress || "0%";
    const status = data.status || "unknown";

    console.log(`Progress: ${progress}, Status: ${status}`);

    if (status === "FAILURE" || status === "failed" || status === "error") {
      console.log("Video generation failed!");
      console.log(JSON.stringify(statusResult, null, 2));
      process.exit(1);
    }

    if (progress === "100%" || progress === 100 || status === "completed" || status === "success") {
      console.log("Video generation completed!");
      break;
    }
  } catch (e) {
    console.log(`Temporary error: ${e.message}, retrying...`);
  }

  await sleep(10000);
}

// Step 3: Download the video to output directory
console.log(`\nDownloading video to ./output/${videoId}.mp4...`);
fs.mkdirSync("./output", { recursive: true });

const videoResponse = await fetch(`${baseUrl}/videos/${videoId}/content`, { headers });
const outputPath = path.join("./output", `${videoId}.mp4`);
fs.writeFileSync(outputPath, Buffer.from(await videoResponse.arrayBuffer()));

if (fs.existsSync(outputPath)) {
  const stats = fs.statSync(outputPath);
  console.log(`Video saved to ${outputPath}`);
  console.log(`File size: ${stats.size} bytes`);
} else {
  console.log("Failed to download video");
  process.exit(1);
}

Versions of Wan2.7

The reason Wan2.7 has multiple snapshots may include potential factors such as variations in output after updates requiring older snapshots for consistency, providing developers a transition period for adaptation and migration, and different snapshots corresponding to global or regional endpoints to optimize user experience. For detailed differences between versions, please refer to the official documentation.

Version
wan2.7