curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}'import os
import requests
payload = {
"model": "wan2.7-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}
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-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}`), &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-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
});
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-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}
),
});
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 Video Edit
Wan 2.7 Video Edit is a dedicated task mode in Alibaba’s Wan video family that edits a source video from text instructions and optional image references.
curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}'import os
import requests
payload = {
"model": "wan2.7-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}
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-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}`), &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-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
});
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-videoedit",
"prompt": "A premium product photograph on a dark studio set, precise typography, soft rim lighting, highly detailed.",
"video_url": "https://cdn.example.com/source.mp4",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"resolution": "1080P",
"duration": 0
}
),
});
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-videoedit"5000Video file to be edited, 2-10s
Describe the content you do not wish to see in the video frame, which can be used to restrict the video frame.
Describe the content you do not wish to see in the video frame, which can be used to restrict the video frame.
500The first frame or reference image.
Describe the content you do not wish to see in the video frame, which can be used to restrict the video frame.
720P, 1080P This parameter only needs to be configured when video truncation is required. If you want the output video to have the same duration as the input video, no setting is needed (or pass the default value 0).
0, 2, 3, 4, 5, 6, 7, 8, 9, 10 Video audio settings. auto (default): The model makes an intelligent judgment based on the prompt content. If the prompt involves audio descriptions, it may regenerate the audio; otherwise, it may retain the original audio of the input material. origin: Forcefully retain the original audio of the input video without regeneration.
auto, origin Whether to add a watermark logo, with the watermark positioned at the bottom right corner of the video.
Was this page helpful?