# wan-2.6/image-to-video

> WAN 2.6 converts text or images into videos (720p/1080p) with synced audio, faster and more affordable than Google Veo3. Ready-to-use REST inference API, best performance, no cold starts, affordable pricing.

- **Provider:** Alibaba
- **Category:** image-to-video
- **Price:** $0.5000 per run

## Key Features

- Animate still images into smooth, high-quality video with natural motion.
- Faithful to the source — preserves subject identity, composition and visual style during animation.
- Prompt-guided motion — control camera movement, subject actions and scene dynamics via text.
- Multiple duration options — generate clips from a few seconds up to the model maximum.
- Resolution support — 720p and 1080p.
- Consistent physics — realistic motion with proper object dynamics and lighting continuity.

## Parameters

| Parameter | Required | Description |
| --- | --- | --- |
| `prompt` | Yes | Text description of the motion and scene dynamics. |
| `image` | Yes | Source image URL to animate. |
| `duration` | No | Video length in seconds (default varies by model). |
| `aspect_ratio` | No | Output ratio: 16:9, 9:16, 4:3, 1:1 (default: matches input). |
| `resolution` | No | Output resolution: 720p, 1080p (default: 1080p). |

## How to Use

1. Upload a high-quality source image that you want to animate.
2. Write a prompt describing the desired motion — camera movement, subject action, and mood.
3. Set duration and resolution based on your needs.
4. Generate and download your animated video clip.

## Code Examples

### Python

```python
import os
import requests

response = requests.post(
    "https://aircube.ai/api/v3/wan-2.6/image-to-video",
    headers={
        "Authorization": "Bearer " + os.environ["AIRCUBE_API_KEY"],
        "Content-Type": "application/json",
    },
    json={
    "prompt": "Camera slowly orbits around the subject, hair flowing gently in the breeze",
    "image": "https://example.com/portrait.jpg",
    "duration": 5
},
    timeout=300,
)
data = response.json()

if data["success"]:
    print("ID:", data["data"]["id"], "Status:", data["data"]["status"])
else:
    print("Error:", data["error"]["message"])
```

### Node.js

```javascript
const response = await fetch("https://aircube.ai/api/v3/wan-2.6/image-to-video", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.AIRCUBE_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "prompt": "Camera slowly orbits around the subject, hair flowing gently in the breeze",
  "image": "https://example.com/portrait.jpg",
  "duration": 5
}),
});

const data = await response.json();

if (data.success) {
  console.log("ID:", data.data.id, "Status:", data.data.status);
} else {
  console.error("Error:", data.error.message);
}
```

### cURL

```curl
curl -X POST "https://aircube.ai/api/v3/wan-2.6/image-to-video" \
  -H "Authorization: Bearer $AIRCUBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "prompt": "Camera slowly orbits around the subject, hair flowing gently in the breeze",
  "image": "https://example.com/portrait.jpg",
  "duration": 5
}'
```

### Python (Async)

```python
import os
import time
import requests

# 1. Submit
response = requests.post(
    "https://aircube.ai/api/v3/wan-2.6/image-to-video",
    headers={
        "Authorization": "Bearer " + os.environ["AIRCUBE_API_KEY"],
        "Content-Type": "application/json",
    },
    json={
    "prompt": "Camera slowly orbits around the subject, hair flowing gently in the breeze",
    "image": "https://example.com/portrait.jpg",
    "duration": 5
},
    timeout=300,
)
data = response.json()

if not data["success"]:
    print("Error:", data["error"]["message"])
    exit(1)

generation_id = data["data"]["id"]
print(f"Submitted: {generation_id}")

# 2. Poll until completed
while True:
    time.sleep(5)
    r = requests.get(
        f"https://aircube.ai/api/v3/status/{generation_id}",
        headers={"Authorization": "Bearer " + os.environ["AIRCUBE_API_KEY"]},
    )
    result = r.json()["data"]

    if result["status"] == "completed":
        print(result["output_url"])
        break
    elif result["status"] == "failed":
        print("Generation failed")
        break
```

### Node.js (Async)

```javascript
// 1. Submit
const response = await fetch("https://aircube.ai/api/v3/wan-2.6/image-to-video", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.AIRCUBE_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "prompt": "Camera slowly orbits around the subject, hair flowing gently in the breeze",
  "image": "https://example.com/portrait.jpg",
  "duration": 5
}),
});
const data = await response.json();

if (!data.success) {
  console.error("Error:", data.error.message);
  process.exit(1);
}

const generationId = data.data.id;
console.log("Submitted:", generationId);

// 2. Poll until completed
while (true) {
  await new Promise((r) => setTimeout(r, 5000));
  const res = await fetch(
    `https://aircube.ai/api/v3/status/${generationId}`,
    { headers: { "Authorization": "Bearer " + process.env.AIRCUBE_API_KEY } },
  );
  const result = (await res.json()).data;

  if (result.status === "completed") {
    console.log(result.output_url);
    break;
  } else if (result.status === "failed") {
    console.error("Generation failed");
    break;
  }
}
```

### cURL (Async)

```curl
# 1. Submit
RESPONSE=$(curl -s -X POST "https://aircube.ai/api/v3/wan-2.6/image-to-video" \
  -H "Authorization: Bearer $AIRCUBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "prompt": "Camera slowly orbits around the subject, hair flowing gently in the breeze",
  "image": "https://example.com/portrait.jpg",
  "duration": 5
}')

ID=$(echo "$RESPONSE" | jq -r '.data.id')
echo "Submitted: $ID"

# 2. Poll until completed
while true; do
  sleep 5
  STATUS_RES=$(curl -s "https://aircube.ai/api/v3/status/$ID" \
    -H "Authorization: Bearer $AIRCUBE_API_KEY")
  STATUS=$(echo "$STATUS_RES" | jq -r '.data.status')

  if [ "$STATUS" = "completed" ]; then
    echo "$STATUS_RES" | jq -r '.data.output_url'
    break
  elif [ "$STATUS" = "failed" ]; then
    echo "Generation failed"; break
  fi
done
```

## Pricing

| Resolution | Duration | Cost |
| --- | --- | --- |
| 720p | 5s | $0.50 |
| 720p | 10s | $1.00 |
| 720p | 15s | $1.50 |
| 1080p | 5s | $0.75 |
| 1080p | 10s | $1.50 |
| 1080p | 15s | $2.25 |

### Billing Rules

- 720p / 5s: $0.50.
- 1080p / 5s: $0.75.
- Longer durations scale proportionally.
- Failed generations are not charged.

## Best Use Cases

- Product animation — bring still product shots to life with subtle motion.
- Social media content — create eye-catching animated posts from static images.
- Ad creatives — transform hero images into engaging video ads.
- Character animation — animate character art or portraits with expressive motion.
- Scene storytelling — extend a keyframe into a full cinematic sequence.

## Pro Tips

- Upload high-resolution, clean images for best motion quality.
- Describe camera movement (zoom in, pan left, orbit around) for cinematic results.
- Start with short durations (3-5s) to iterate quickly, then extend for final renders.
- Keep the subject centered in the source image for more stable animation.
- Mention specific actions (walking, waving, flowing) for directed character motion.

## Notes

- Input images should be under 10 MB (JPEG, PNG, WebP).
- Video output is typically MP4 format.
- Generation time varies with duration and resolution — longer clips take more time.

## FAQ

**Q: What is the wan-2.6/image-to-video API?**

WAN 2.6 converts text or images into videos (720p/1080p) with synced audio, faster and more affordable than Google Veo3. Ready-to-use REST inference API, best performance, no cold starts, affordable pricing.

**Q: How long can the generated video be?**

Duration depends on the model — typically 5 to 15 seconds. Check the parameters section for the specific range.

**Q: Will the output video match my input image?**

Yes — the model preserves the visual style, colors, and subject identity from your source image while adding motion.

**Q: Can I use wan-2.6/image-to-video outputs commercially?**

Yes — generated videos are yours to use commercially. Review the Pricing page for any plan limits.
