curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}'import os
import requests
payload = {
"model": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": True
}
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": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}`), &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": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
});
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": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}
),
});
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"
}
}Seedance 2.5 Image to Video
Seedance 2.5 Image to Video is the official full-capability discount route that animates a first frame (and optionally a last frame) into video. The Seedance family emphasizes prompt following, coherent motion, multi-shot storytelling, and synchronized audio. This is a full-capability variant: media URLs are submitted to the asset review service before the task is submitted, so plain public URLs always work in requests.
curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}'import os
import requests
payload = {
"model": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": True
}
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": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}`), &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": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
});
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": "seedance-2.5-i2v",
"prompt": "Animate this still into a cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/first-frame.png"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}
),
});
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.
"seedance-2.5-i2v"Generation or editing instructions, up to 30000 characters. It is recommended to keep the prompt to no more than 500 Chinese characters or 1,000 English words. Lengthy text will lead to scattered information, and the model may ignore details and only focus on key points, resulting in missing elements in the generated video.
30000First frame image URL; a second URL is used as the last frame constraint. 1 to 2 images are supported.
1 - 2 elementsVideo duration in seconds, from 4 to 30.
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 4 <= x <= 30Generate video resolution.
480p, 720p Aspect ratio of the generated video,When the ratio is configured as adaptive, the model will automatically adapt the aspect ratio according to the generation scenario.
adaptive, 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 Controls whether the generated video contains audio synchronized with the visuals.
Was this page helpful?