curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}'import os
import requests
payload = {
"model": "seedance-2.5-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}
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-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}`), &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-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
});
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-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}
),
});
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 X Reference to Video
Seedance 2.5 X Reference to Video is the lowest-cost multimodal route in APIPod’s Seedance 2.5 family, billed per second.
curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}'import os
import requests
payload = {
"model": "seedance-2.5-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}
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-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}`), &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-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
});
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-x-r2v",
"prompt": "A cinematic tracking shot through a rain-soaked neon street, realistic motion, synchronized ambient sound.",
"image_urls": [
"https://cdn.example.com/reference-1.jpg"
],
"video_urls": [
"https://cdn.example.com/reference.mp4"
],
"audio_urls": [
"https://cdn.example.com/reference.mp3"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}
),
});
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-x-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.
1 - 30000Reference image URLs (up to 30). Real-person images are supported.
30Reference video URLs (up to 10). Reference video length is billed on top of the output duration.
10Reference audio URLs (up to 10). Audio cannot be used alone; include at least one image or video reference.
10Video duration in seconds (5-30).
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 5 <= x <= 30Output resolution. Only 720p is available.
720p Aspect ratio of the generated video: 1:1, 2:3, 3:2, 3:4, 4:3, 9:16, 16:9 or 21:9.
16:9, 9:16, 1:1, 4:3, 3:4, 21:9, 2:3, 3:2 Was this page helpful?