curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}'import os
import requests
payload = {
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}
response = requests.post(
"https://api.apipod.ai/v1/videos/generations",
headers={
"Authorization": f"Bearer {os.environ['APIPOD_API_KEY']}",
"Content-Type": "application/json",
},
json=payload,
timeout=60,
)
response.raise_for_status()
print(response.json())package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload := map[string]any{}
if err := json.Unmarshal([]byte(`{
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}`), &payload); err != nil {
panic(err)
}
body, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.apipod.ai/v1/videos/generations", bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("APIPOD_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.Status)
}use reqwest::Client;
use serde_json::json;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let payload = json!({
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
});
let response = Client::new()
.post("https://api.apipod.ai/v1/videos/generations")
.bearer_auth(env::var("APIPOD_API_KEY")?)
.json(&payload)
.send()
.await?
.error_for_status()?;
println!("{}", response.text().await?);
Ok(())
}const response = await fetch("https://api.apipod.ai/v1/videos/generations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIPOD_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(
{
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}
),
});
if (!response.ok) {
throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
}
console.log(await response.json());{
"code": 200,
"message": "success",
"data": {
"task_id": "vid_task_01JEXAMPLE"
}
}WAN 2.7 Image to Video
Wan 2.7 Image to Video is a dedicated task mode in Alibaba’s Wan video family that animates a first-frame image and supports last-frame control where exposed.
curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}'import os
import requests
payload = {
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}
response = requests.post(
"https://api.apipod.ai/v1/videos/generations",
headers={
"Authorization": f"Bearer {os.environ['APIPOD_API_KEY']}",
"Content-Type": "application/json",
},
json=payload,
timeout=60,
)
response.raise_for_status()
print(response.json())package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload := map[string]any{}
if err := json.Unmarshal([]byte(`{
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}`), &payload); err != nil {
panic(err)
}
body, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.apipod.ai/v1/videos/generations", bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("APIPOD_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.Status)
}use reqwest::Client;
use serde_json::json;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let payload = json!({
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
});
let response = Client::new()
.post("https://api.apipod.ai/v1/videos/generations")
.bearer_auth(env::var("APIPOD_API_KEY")?)
.json(&payload)
.send()
.await?
.error_for_status()?;
println!("{}", response.text().await?);
Ok(())
}const response = await fetch("https://api.apipod.ai/v1/videos/generations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIPOD_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(
{
"model": "wan2.7-i2v",
"prompt": "Animate the subject with a slow camera push-in, natural motion, and soft cinematic lighting.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 5
}
),
});
if (!response.ok) {
throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
}
console.log(await response.json());{
"code": 200,
"message": "success",
"data": {
"task_id": "vid_task_01JEXAMPLE"
}
}Authorizations
Use your APIPod API key as a Bearer token in the Authorization header.
Body
Public APIPod model ID.
"wan2.7-i2v"Describe the content of the video to be generated.
5000The image address of the first frame or the first and last frames.
Whether to enable intelligent prompt rewriting. After enabling, a large model will be used to intelligently rewrite the input prompt. The generation effect is significantly improved for short prompts, but it will increase time consumption.
Whether to enable intelligent prompt rewriting. After enabling, a large model will be used to intelligently rewrite the input prompt. The generation effect is significantly improved for short prompts, but it will increase time consumption.
500Extend generating content based on the given video, with the maximum duration of the continuation controlled by the duration parameter. For example: when duration=15 and the input video is 3 seconds long, the model will generate a 12-second continuation, resulting in a final output video with a total duration of 15 seconds, which will be charged as 15 seconds. Video duration: 2–10s.
Duration of the generated video.
720P, 1080P Duration of the generated video.
2 <= x <= 15Whether to add a watermark logo, with the watermark positioned at the bottom right corner of the video.
Was this page helpful?