curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}'import os
import requests
payload = {
"model": "seedance-2.5-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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 Lite Reference to Video
Seedance 2.5 Lite Reference to Video is the special-price full-capability route that uses reference images, video, or audio to guide subjects, motion, visual style, and sound. It accepts up to 30 reference images, 10 reference videos, and 10 reference audios, supports durations up to 30 seconds, and outputs 720p only. 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-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"duration": 4,
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}'import os
import requests
payload = {
"model": "seedance-2.5-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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-lite-r2v",
"prompt": "Keep the character and voice, cinematic product shot with natural lighting.",
"image_urls": ["https://example.com/reference.png"],
"video_urls": ["https://example.com/reference.mp4"],
"audio_urls": ["https://example.com/voice.mp3"],
"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"
}
}Asset and Scene Limits
Seedance 2.5 Lite reference-material mode is a special-price full-capability route with a built-in asset library, no facial distortion, a 100% pass rate for real-person content, and long-term stability. It bills at special-offer rates and only successful tasks are charged — see the pricing page for live rates.- Text prompt: For Chinese, keep it under 500 characters; for English, under 1,000 words.
- Image input: Supports jpeg, png, webp, bmp, tiff, gif, heic, and heif formats; each image under 30 MB; aspect ratio range (0.4, 2.5); width and height range (300px, 6000px).
- Image count: No more than 30 images.
- Video input: Each video 2–30 seconds; up to 10 reference videos; total video duration must not exceed 30 seconds.
- Audio input: Each clip 2–30 seconds; up to 10 reference audio clips; total audio duration must not exceed 30 seconds.
- Audio input restriction: Audio cannot be provided on its own; at least one reference image or reference video is required.
- Resolution: 720p only — 480p, 1080p, 2K and 4K are not supported on this route.
- Duration: 4–30 seconds per clip (default 4s).
Authorizations
Use your APIPod API key as a Bearer token in the Authorization header.
Body
Public APIPod model ID.
"seedance-2.5-lite-r2v"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.
30000Reference image URLs. Up to 30 images are supported; each image must be smaller than 30 MB.
30Reference video URLs. Up to 10 videos are supported; each video lasts 2-30 seconds and the total duration of all videos must not exceed 30 seconds.
10Reference audio URLs. Up to 10 audios are supported; each audio lasts 2-30 seconds and the total duration of all audios must not exceed 30 seconds. Please note that audio files cannot be uploaded alone; at least one reference video or image must be included.
10Video 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.
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?