curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "seedance-2.5-image-to-video",
image_url: "https://example.com/input.png",
prompt: "a mountain river flowing through a pine forest at dawn",
duration: 8
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_abc123",
"object": "video.generation",
"model": "seedance-2.5-image-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"error": {
"message": "Invalid image URL or unsupported image format.",
"type": "invalid_request_error",
"param": "image_url",
"code": 400
}
}
Seedance Series
Seedance 2.5 Image To Video
ByteDance’s latest video model for generating 480p/720p video from text, images, or multimodal references, with editing and extending of existing footage, native audio, and per-second billing.
POST
/
v1
/
videos
/
generations
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "seedance-2.5-image-to-video",
image_url: "https://example.com/input.png",
prompt: "a mountain river flowing through a pine forest at dawn",
duration: 8
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_abc123",
"object": "video.generation",
"model": "seedance-2.5-image-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"error": {
"message": "Invalid image URL or unsupported image format.",
"type": "invalid_request_error",
"param": "image_url",
"code": 400
}
}
Pricing: See vibetool.ai/pricing for current rates.
Input Modalities
- Image – a still image to animate, edit, or extend
- Text – (optional) a prompt describing the desired motion, scene changes, or edit
Output Modality
- Video – an MP4 file with native audio, available at 480p or 720p and 4–30 seconds long
Authorization
string
required
All APIs require Bearer Token authentication. Format:
Bearer YOUR_API_KEYRequest Body
string
required
The model identifier. Use
"seedance-2.5-image-to-video".string
required
A publicly accessible URL to the input image. The image is used as the starting frame for the generated video.
string
Optional text description of the desired video content, including motion, scene changes, or edits to the input image (e.g., “a person walking through a neon-lit city street at night, cinematic lighting”).
number
Requested video duration in seconds, between 4 and 30. The model may adjust the duration to match its capabilities.
Response Schema
string
required
Unique identifier for the generation task.
string
required
Type of object, always
"video.generation".string
required
The model used, e.g.,
"seedance-2.5-image-to-video".integer
required
Unix timestamp (seconds) of task creation.
string
required
Initial status:
"pending" or "processing". Use the Get Video Status endpoint to poll for completion.string
required
The task ID to query in the status endpoint.
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "seedance-2.5-image-to-video",
image_url: "https://example.com/input.png",
prompt: "a mountain river flowing through a pine forest at dawn",
duration: 8
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "seedance-2.5-image-to-video",
"image_url": "https://example.com/input.png",
"prompt": "a mountain river flowing through a pine forest at dawn",
"duration": 8,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_abc123",
"object": "video.generation",
"model": "seedance-2.5-image-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"error": {
"message": "Invalid image URL or unsupported image format.",
"type": "invalid_request_error",
"param": "image_url",
"code": 400
}
}
task_id until status is "completed" and the generated video URL is available.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use seedance-2.5-image-to-video.
Available options:
seedance-2.5-image-to-video Input image used as the starting frame
Text description of the video to generate
Duration in seconds (4-30)
Required range:
4 <= x <= 30Output resolution tier
Available options:
480p, 720p Was this page helpful?